如何用sed替换任意层数../前缀加foo的字符串?
sed 替换任意层数
../前缀加foo的规则写法 推荐写法(扩展正则模式,易读少转义)
使用-E参数开启sed扩展正则支持,命令如下:
sed -E 's/(\.\.\/)*foo/foo1/g'
规则说明:
-E:开启扩展正则表达式,无需对分组括号()、量词*做额外转义,兼容性覆盖GNU sed和BSD/macOS sed(\.\.\/):匹配单个../字符串*:量词,匹配前面的../分组0次或任意多次,正好满足前缀可选、可重复任意层数的要求- 末尾的
g为全局替换标记,一行内存在多个符合规则的字符串时会全部替换,无全局替换需求可删除
兼容基础正则的写法
如果不能使用-E参数,使用基础正则语法对分组括号转义即可:
sed 's/\(\.\.\/\)*foo/foo1/g'
注意事项
如果你的需求是必须至少包含1层../前缀才触发替换(即单独出现的foo不替换),只需要把正则中的*替换为+即可,扩展正则对应写法:
sed -E 's/(\.\.\/)+foo/foo1/g'
效果验证
测试输入文本:
示例内容:../foo、../../foo、../../../foo、单独的foo
执行默认*量词的命令后输出:
示例内容:foo1、foo1、foo1、单独的foo1
如果使用+量词的版本,单独的foo不会被替换,输出为:
示例内容:foo1、foo1、foo1、单独的foo
内容的提问来源于stack exchange,提问作者Rubans
相关产品推荐
相关产品推荐

