regex - 在 sed 和 perl 中替换单引号

标签 regex perl sed

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

# 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/

相关文章:

Javascript正则表达式无法分割

perl - 如何告诉 bash 不要扩展 $_ 变量?

mysql - 无法运行 pt-table-checksum

bash - 使用 perl 就地替换将软链接(soft link)/符号链接(symbolic link)更改为静态文件

regex - linux:从单行 XML 字符串中剪切并打印特定参数

java - 使用正则表达式在字符串中查找模式 -> 如何改进我的解决方案

regex - Powershell正则表达式用可变长度的字符串替换数字

xml - 使用 sed 创建 XML 数组

bash - UNIX Bash - 从文件中的特定字符串中删除双引号

从数据框中删除特殊字符