正则表达式在regex101运行正常但sed中执行失效问题咨询
问题原因
- 最核心的问题是 sed 所使用的 POSIX 扩展正则规范不支持非贪婪匹配语法(也就是你写的
.+?里的?非贪婪标记)。你在正则测试平台上用的是 PCRE 正则引擎,天然支持非贪婪匹配所以运行正常,但在 sed 中,.+?会被解析为「匹配1次及以上任意字符 + 匹配字面量问号」,完全达不到你要的「匹配到第一个空格就停止」的效果。 - 你命令末尾加的
g全局替换标记也是多余的,行首匹配只会执行一次,不需要加这个参数。
正确实现方案
把非贪婪匹配的逻辑换成 POSIX 正则支持的写法即可:用 [^ ] 匹配所有非空格字符,直接匹配到第一个空格为止,不需要用非贪婪标记。
对应的正确命令如下:
echo "50G This is a Test (0000) 1234p (String).ext" | sed -E 's|^[^ ]* ||'
如果你还是想用捕获组的写法,也可以改成:
echo "50G This is a Test (0000) 1234p (String).ext" | sed -E 's|^[^ ]* (.*)|\1|'
两种写法执行后都能得到你预期的输出结果。
内容的提问来源于stack exchange,提问作者Sachin
相关产品推荐
相关产品推荐

