用sed和perl替换单引号

时间:2018-10-01 02:05:37

标签: regex perl sed

有人可以解释这两个命令发生了什么吗?为什么sedperl在运行相同的正则表达式模式时会得到不同的结果:

# echo "'" | sed -e "s/\'/\'/"
''
# echo "'" | perl -pe "s/\'/\'/"
'
# sed --version
sed (GNU sed) 4.5

1 个答案:

答案 0 :(得分:8)

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

使其更加明显:

echo foo | sed -e "s/\'/@/"

产生

foo@

文档hereGNU sed manual

编辑:perl中的等效项是\Z(或\z,具体取决于您要如何处理尾随的换行符)。由于\'在perl正则表达式中不是特殊序列,因此它仅与文字引号匹配。正如其他答案和评论中所提到的那样,不必在双引号引起来的字符串中转义单引号,并且如您所发现的那样,可能会导致意外的行为。