Linux 如何在sed中使用引号?

Linux 如何在sed中使用引号?,linux,bash,sed,alias,quotes,Linux,Bash,Sed,Alias,Quotes,我怎么得到这个 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 -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
的输出是非常困难的。例如,一个健壮的解决方案可以使用
find
或fileglobs(like),但问题的重点是关于转义双引号。

您错过了等号,必须转义双引号。请尝试以下操作:


别名asdf=“ls-1 | sed's/\(.*\)/alias\1\“shot\1\”/”“

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

您可以将此
用于
循环:

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

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

my_func() {
  ls -1 | sed 's/.*/alias & "shot &"/'
}
不过,你应该这样做。请阅读链接

在您的情况下,假设文件名中没有换行符,可以使用^0:

my_func() {
  printf '%s\n' * | sed 's/\(.*\)/alias \1 "shot \1"/'
}

^0,这将使您在解析ls时遇到与解析ls相同的问题,但不会调用额外的进程,因为printf是buildin。

使用\返回不匹配的“”对引号进行转义。