Regex 如果正则表达式周围没有单引号,sed将出错
我尝试在bash中执行以下命令:Regex 如果正则表达式周围没有单引号,sed将出错,regex,shell,sed,Regex,Shell,Sed,我尝试在bash中执行以下命令: ls -1 | sed s/\(.*\)/"\1"/ 这是在ls的每个输出周围添加双引号,但结果显示 sed:1:“s/(.*)/\1/”:\1未在RE中定义 在正则表达式周围添加单引号后,得到了正确的结果。正确的答案是: ls-1 | sed's/\(.*\)/“\1/” 神权统治下我不需要外部引用,对吗?任何人都有相同的经历?单引号用于禁用各种序列的shell解析,包括反斜杠转义。如果不使用它们,则像\(这样的序列将作为(传递给sed。您可以通过在命令开头
ls -1 | sed s/\(.*\)/"\1"/
这是在ls
的每个输出周围添加双引号,但结果显示
sed:1:“s/(.*)/\1/”:\1未在RE中定义
在正则表达式周围添加单引号后,得到了正确的结果。正确的答案是:
ls-1 | sed's/\(.*\)/“\1/”
神权统治下我不需要外部引用,对吗?任何人都有相同的经历?单引号用于禁用各种序列的shell解析,包括反斜杠转义。如果不使用它们,则像\(
这样的序列将作为(
传递给sed。您可以通过在命令开头添加echo
来检查这一点。单引号用于禁用各种序列的shell解析,包括反斜杠转义。如果不使用它们,则像\(
作为传递给sed)(
。您可以通过在命令开头添加echo
来检查这一点。将命令发送到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"/
这很难看。将命令发送到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"/
这太难看了。引用的不是sed,而是shell。@franky:或者sed的/*/“&”/
@Cyrus这是什么意思?来自man sed
:“s/regexp/replacement/”:尝试将regexp与模式空间匹配。如果成功,请替换与replacement匹配的部分。替换可能包含特殊字符&用于引用模式空间中匹配的部分,特殊转义符\1到\9用于引用regexp中相应的匹配子表达式tes不是为sed而存在的,是为外壳而存在的。@franky:orsed的/*/“&”/
@Cyrus这里是什么意思?来自man sed
:“s/regexp/replacement/”:尝试将regexp与模式空间匹配。如果成功,请替换与replacement匹配的部分。替换可能包含特殊字符&以引用模式空间中匹配的部分,特殊转义符从\1到\9引用regexp中相应的匹配子表达式。