MacOS下sed命令分组内OR运算符失效,求正确正则写法
解决MacOS下sed分组OR匹配的问题
先看你的测试文件内容:
This is ('apple'). This is ('orange'). This is ('banana').
你单独匹配'apple'能成功,但用('apple'|'orange')没结果,核心原因是MacOS自带的sed是BSD版本,默认使用基础正则表达式(BRE),而()和|在BRE里属于普通字符,必须转义才能表示分组和或运算。
给你两种可行的写法:
方法1:启用扩展正则(推荐)
添加-E参数切换到扩展正则表达式(ERE)模式,此时()和|可以直接使用,无需转义:
cat file.txt | sed -nE "/('apple'|'orange')/p"
执行后会输出前两行目标内容:
This is ('apple'). This is ('orange').
方法2:转义特殊字符(基础正则写法)
如果不想加-E参数,需要给()和|都加上反斜杠进行转义:
cat file.txt | sed -n "/\('apple'\)\|\('orange'\)/p"
同样能得到正确的匹配结果。
简单总结:BSD sed默认不识别未转义的分组与或运算符,要么通过-E启用扩展正则简化写法,要么给特殊字符加反斜杠适配基础正则规则。
内容的提问来源于stack exchange,提问作者tuty_fruity
相关产品推荐
相关产品推荐

