首页 > 解决方案 > 在 sed 和 perl 中替换单引号

问题描述

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

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

标签: regexperlsed

解决方案


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

为了让它更明显一点:

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

生产

foo@

记录在此处,并在GNU sed 手册中

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


推荐阅读