在sed和perl中替换单引号

Cyk*_*ker 3 regex perl sed

有人可以解释一下这两个命令发生了什么吗?为什么运行相同的正则表达式模式sedperl给出不同的结果:

# echo "'" | sed -e "s/\'/\'/"
''
# echo "'" | perl -pe "s/\'/\'/"
'
# sed --version
sed (GNU sed) 4.5
Run Code Online (Sandbox Code Playgroud)

Sha*_*awn 8

你正在使用GNU sed,对吗?\'是一个扩展,在GNU的基本正则表达式实现中充当字符串结尾的锚点.因此,您在输出中看到两个引号,因为s匹配行的末尾并在行中已有的引号之后添加引号.

为了使它更明显:

echo foo | sed -e "s/\'/@/"
Run Code Online (Sandbox Code Playgroud)

产生

foo@
Run Code Online (Sandbox Code Playgroud)

记录在这里,并在GNU sed的手册

编辑:perl中的等价物是\Z(或者可能\z取决于您希望如何处理尾随换行符).由于\'perl正则表达式中不是特殊序列,因此它只匹配文字引号.正如在其他答案和注释中所提到的,在双引号字符串中转义单引号是没有必要的,正如您所发现的那样,可能会导致意外行为.