如何在引号内使用sed中的引号?

时间:2016-12-16 16:19:46

标签: linux bash sed alias quotes

我如何得到这个

ls -1 | sed 's/\(.*\)/alias \1 "shot \1"/'

成别名?

示例:

alias asdf "ls -1 | sed 's/\(.*\)/alias \1 "shot \1"/'"

问题是当我找到别名的引号时。

4 个答案:

答案 0 :(得分:1)

不要使用别名,请使用函数:

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。

答案 1 :(得分:0)

像这样:

alias asdf="ls -1 | sed 's/.*/alias & \"shot &\"/'"

您忘记了赋值运算符(=);要在双引号内获得双引号,您必须使用\"转义它们。

此外,我已将您的捕获组和反向引用更改为使用&,代表完全匹配。

请注意,以编程方式处理ls的输出为not recommended。例如,一个强大的解决方案将使用find或fileglobs(如anubhava's answer),但问题的主要内容是关于转义双引号。

答案 2 :(得分:0)

你错过了相同的符号,你必须逃避双引号。试试这个:

alias asdf="ls -1 | sed 's/\(.*\)/alias \1 \"shot \1\"/'"

答案 3 :(得分:0)

假设您的文件名只包含字母数字或DOT或下划线,则应避免解析ls的输出。 在您的命令中使用管道的另一个缺陷是仅在子shell中创建alias而不是在当前shell中。

您可以改为使用此for循环:

for f in *; do
   alias $f="shot $f"
done