我怎么得到这个如何在报价中使用sed中的引号?
ls -1 | sed 's/\(.*\)/alias \1 "shot \1"/'
到别名?
例子:
alias asdf "ls -1 | sed 's/\(.*\)/alias \1 "shot \1"/'"
问题是,当我到了引号的别名。
我怎么得到这个如何在报价中使用sed中的引号?
ls -1 | sed 's/\(.*\)/alias \1 "shot \1"/'
到别名?
例子:
alias asdf "ls -1 | sed 's/\(.*\)/alias \1 "shot \1"/'"
问题是,当我到了引号的别名。
像这样:
alias asdf="ls -1 | sed 's/.*/alias & \"shot &\"/'"
你忘了赋值运算符(=
);要在双引号内得到双引号,你必须用\"
来转义它们。
此外,我已将您的捕获组和反向引用更改为使用&
,即代表完整匹配。
请注意,以编程方式处理ls
的输出是not recommended。例如,一个强大的解决方案将使用find
或fileglobs(如anubhava's answer),但问题的主要观点是关于转义双引号。
您错过了相同的符号,您必须使用双引号。试试这个:
alias asdf="ls -1 | sed 's/\(.*\)/alias \1 \"shot \1\"/'"
假设你的文件名只包含字母,数字或点或下划线,你应该避免解析的ls
输出。 另一个缺陷是在您的命令中使用管道,这将只在子shell中创建alias
,而不是在当前shell中。
您可以使用此for
循环,而不是:
for f in *; do
alias $f="shot $f"
done
不要使用别名,使用函数:
my_func() {
ls -1 | sed 's/.*/alias & "shot &"/'
}
但是你应该avoid parsing the output of ls。请阅读链接!
在你的情况下,假设没有出现在文件名中没有换行符,可以使用^ 0:
my_func() {
printf '%s\n' * | sed 's/\(.*\)/alias \1 "shot \1"/'
}
^0,这给你留下解析LS同样的问题会,但是没有不调用额外的过程,因为printf是buildin。
用\返回不匹配的转义引号。 – user1869582