sed替换斜杠后字符问题及正则表达式失效原因咨询
为什么你的sed正则没生效?来拆解原因!
我明白你的需求:要把文本里所有斜杠/后面的内容(直到遇到空格为止)都替换为空,试过sed 's/\/[^\ ]+//g'却没效果,但其他方案能正常工作对吧?这问题出在sed的正则规则上,我给你理清楚:
核心问题:sed默认用的是基础正则表达式(BRE)
你写的+在基础正则表达式里是普通字符,不是“匹配一次或多次”的元字符!所以你的正则实际是在找/后面跟着“非空格字符+加号”的组合,而不是“一个或多个非空格字符”,自然匹配不到你想要的内容。
两种修正方法
1. 转义+让它在BRE里生效
把+前面加反斜杠,让sed把它当成元字符处理:
sed 's/\/[^\ ]\+//g'
2. 使用扩展正则表达式(ERE)
给sed加-E参数,就能直接用+这类扩展元字符,写法更简洁:
sed -E 's/\/[^ ]+//g'
(这里[^\ ]可以简化成[^ ],效果完全一样)
举个例子验证
假设你的输入文本是:
hello/world foo/bar test/123
用错误的命令处理后不会有任何变化,但用上面两种正确命令处理后,结果会变成:
hello foo test
为什么Yudong和Choroba的方案有效?
他们的方案大概率是用了扩展正则表达式(加了-E参数),或者用了BRE里支持的*元字符(*匹配零次或多次,和+的“一次或多次”略有区别,但多数场景下也能满足你的需求),所以能正确匹配到/后面的内容。
内容的提问来源于stack exchange,提问作者Amateur




