regex - 在 sed 和 perl 中替换单引号
问题描述
有人可以解释一下这两个命令发生了什么吗?为什么要运行相同的正则表达式模式sed
并给出不同的结果:perl
# echo "'" | sed -e "s/\'/\'/"
''
# echo "'" | perl -pe "s/\'/\'/"
'
# sed --version
sed (GNU sed) 4.5
解决方案
您使用的是 GNU sed,对吗?\'
是一个扩展,在 GNU 的基本正则表达式实现中充当字符串结尾的锚。因此,您会在输出中看到两个引号,因为s
匹配行尾并在已经在行中的那个之后添加一个引号。
为了让它更明显一点:
echo foo | sed -e "s/\'/@/"
生产
foo@
记录在此处,并在GNU sed 手册中
编辑: perl 中的等价物是\Z
(或者可能\z
取决于您希望如何处理尾随换行符)。由于\'
不是 perl 正则表达式中的特殊序列,它只匹配文字引号。正如其他答案和评论中所提到的,在双引号字符串中转义单引号不是必需的,并且正如您所发现的那样,可能会导致意外行为。
推荐阅读
- reactjs - React + NextJS - 受保护的路线
- swift - 如何制作具有通用类数组属性的协议
- google-sheets - 在电子表格 API 中逐列搜索的正确方法是什么
- docker - 下载 Docker 映像时出现“意外的 EOF”
- type-conversion - 使用 FreePascal 将 QR 码转换为 WMF 流
- python - 在Python中以数组作为参数的函数内制作矩阵
- linux - CPack:排除特定的 RPM 依赖项
- java - Junit 测试场景不执行回滚
- reactjs - 是否可以配置 wdio 以使用不同的 tsconfig 文件?
- video - 如何从 FFmpeg 在 julia 的监视器中获取实时视频?