使用sed分割含可选子串的字符串时匹配异常如何解决?
错误原因
- 语法兼容性问题:默认sed使用POSIX基础正则(BRE)规则,你写的
?不会被识别为「可选匹配」的量词,必须转义为\?才会生效,就算做了转义,仍然存在下一个问题。 - 贪婪匹配冲突:正则开头的
.*是贪婪匹配,会尽可能吞掉更多的字符,即使(NEW)?的规则生效,.*也会直接匹配到BWP的前一位,吞掉中间的NEW,导致第二个捕获组永远拿不到内容。
修复方法
利用正则分支优先匹配更长有效串的特性,直接把两种可能的目标前缀放在同一个捕获组,规避贪婪匹配的问题,使用-E参数开启扩展正则简化语法,不需要多余的cat管道:
sed -E 's/(.*)(NEWBWP|BWP)([0-9]+)H.*/\0 \2 \3H/' <text_file>
输出结果
运行命令后和预期完全一致:
TEXT1D1NEWBWP210HTEXT2 NEWBWP 210H TEXT1D1BWP210HTEXT2 BWP 210H
内容的提问来源于stack exchange,提问作者user1495523
相关产品推荐
相关产品推荐

