谁能解释一下这两个命令发生了什么?为什么 sed
和 perl
运行相同的正则表达式模式会给出不同的结果:
# echo "'" | sed -e "s/\'/\'/"
''
# echo "'" | perl -pe "s/\'/\'/"
'
# sed --version
sed (GNU sed) 4.5
最佳答案
您使用的是 GNU sed,对吗? \'
是一个扩展,在 GNU 的基本正则表达式实现中充当字符串结尾的 anchor 。因此,您会在输出中看到两个引号,因为 s
匹配行尾并在行中已经存在的引号之后添加一个引号。
为了让它更明显一点:
echo foo | sed -e "s/\'/@/"
生产
foo@
已记录 here ,并在 GNU sed manual
编辑:perl 中的等价物是 \Z
(或者可能是 \z
取决于您要如何处理尾随换行符)。由于 \'
不是 perl 正则表达式中的特殊序列,它只匹配文字引号。正如其他答案和评论中所提到的,在双引号字符串中转义单引号是不必要的,并且正如您所发现的那样,可能会导致意外行为。
关于regex - 在 sed 和 perl 中替换单引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52583763/