You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动