我尝试在bash中执行以下命令:
ls -1 | sed s/\(.*\)/"\1"/
在ls
的每个输出周围添加双引号,但结果显示
sed: 1: "s/(.*)/\1/": \1 not defined in the RE
在正则表达式周围添加单引号后,我得到了正确的结果。正确的是:
ls -1 | sed 's/\(.*\)/"\1"/'
通常我不需要外引号吗?任何人都有相同的经历吗?
答案 0 :(得分:2)
单引号用于禁用各种序列的shell解析,包括反斜杠转义。如果您不使用它们,则\(
之类的序列将作为(
传递给sed。您可以通过将echo
添加到命令的开头来检查。
答案 1 :(得分:2)
将命令发送到echo
将显示sed看到的内容
$ echo sed s/\(.*\)/"\1"/
sed
嗯,sed脚本完全消失了。暴露的“*”强制shell尝试匹配文件。我们禁用它:
$ set -f
$ echo sed s/\(.*\)/"\1"/
sed s/(.*)/\1/
shell吃了引号和反斜杠。引用sed脚本:
$ echo sed 's/\(.*\)/"\1"/'
sed s/\(.*\)/"\1"/
这给出了正确的结果,sed会看到你想要的脚本。如果没有引号我们怎么能这样做
$ echo sed s/\\\(.\*\\\)/\"\\1\"/
sed s/\(.*\)/"\1"/
这太丑了。