使用sed精确匹配双下划线替换无效果,应如何调整命令
问题原因分析
你的sed命令执行后无修改,主要有两类可能的原因:
- 词边界匹配规则不符合预期
\<和\>是sed中的词边界锚点,仅当对应位置两侧分别为「非单词字符」和「单词字符(字母、数字、下划线)」时才会匹配成功。你要匹配的目标__本身属于单词字符,因此\<__\>的规则实际要求双下划线的左右两侧都不能是字母、数字、下划线,只要目标双下划线前后存在上述三类字符,就会匹配失败,自然不会触发替换。 - 系统sed实现兼容问题
如果你使用的是macOS自带的BSD sed,-i参数需要额外传入备份文件后缀,不保留备份的话需要写为-i '',否则命令会执行失败,不会修改文件。
修复方案
根据你的匹配需求选择对应写法:
场景1:仅匹配独立成词的双下划线(双下划线前后均为非单词字符)
GNU sed(Linux默认sed)环境写法:
sed -i 's/\b__\b/.abc.def__/g' file
BSD sed(macOS默认sed)环境写法:
sed -i '' 's/\b__\b/.abc.def__/g' file
场景2:匹配所有不与其他下划线连续的双下划线(前后仅要求不是下划线,其他字符不限)
需要覆盖行首、行尾、中间三种位置的匹配场景,GNU sed写法如下:
sed -i 's/\([^_]\)__\([^_]\)/\1.abc.def__\2/g; s/^__\([^_]\)/.abc.def__\1/g; s/\([^_]\)__$/\1.abc.def__/g; s/^__$/.abc.def__/g' file
内容的提问来源于stack exchange,提问作者ZakS
相关产品推荐
相关产品推荐

