如果正则表达式周围没有单引号,则sed会出错

时间:2016-03-13 13:18:59

标签: regex shell sed

我尝试在bash中执行以下命令:

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

ls的每个输出周围添加双引号,但结果显示 sed: 1: "s/(.*)/\1/": \1 not defined in the RE

在正则表达式周围添加单引号后,我得到了正确的结果。正确的是:

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

通常我不需要外引号吗?任何人都有相同的经历吗?

2 个答案:

答案 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"/

这太丑了。