有人可以解释这两个命令发生了什么吗?为什么sed
和perl
在运行相同的正则表达式模式时会得到不同的结果:
# echo "'" | sed -e "s/\'/\'/"
''
# echo "'" | perl -pe "s/\'/\'/"
'
# sed --version
sed (GNU sed) 4.5
答案 0 :(得分:8)
您正在使用GNU sed,对吗? \'
是一个扩展,充当GNU基本正则表达式实现中字符串结尾的锚点。因此,您会在输出中看到两个引号,因为s
与行的末尾匹配,并在行中已有的引号之后添加了一个引号。
使其更加明显:
echo foo | sed -e "s/\'/@/"
产生
foo@
中
编辑:perl中的等效项是\Z
(或\z
,具体取决于您要如何处理尾随的换行符)。由于\'
在perl正则表达式中不是特殊序列,因此它仅与文字引号匹配。正如其他答案和评论中所提到的那样,不必在双引号引起来的字符串中转义单引号,并且如您所发现的那样,可能会导致意外的行为。