Bash下如何使用sed与正则替换可变数量令牌间的文本?
解决可变数量令牌的sed文本替换问题
我来帮你搞定这个需求!你想要把类似 /abc/bcd/cde/ 这样的路径字符串,把每个 / 之间的令牌文本(比如abc、bcd、cde)都替换成..,最终得到 /../../../。之前的sed命令出错是因为正则匹配逻辑不对,咱们来一步步修正:
问题分析
你之前用的命令 echo "/abc/bcd/cde/" | sed 's//.*///..//g' 有两个核心问题:
- 分隔符和路径的
/冲突,导致正则解析混乱,sed无法正确识别匹配规则 .*是贪婪匹配模式,会直接从第一个/匹配到最后一个/的所有内容,所以只执行了一次替换,最终只得到/../
正确的sed解决方案
我们可以换用非贪婪的精准匹配方式,针对每个/后的令牌单独替换,推荐用#作为sed的分隔符(避免和路径/冲突,可读性更强):
echo "/abc/bcd/cde/" | sed 's#/[^/]*#/..#g'
正则规则解释
#:替代sed默认的/作为命令分隔符,彻底避免和路径中的/混淆/[^/]*:匹配一个/,后面跟着任意数量的非/字符(也就是我们要替换的令牌文本),确保只匹配单个令牌区间/..:把匹配到的/xxx格式内容替换成/..g:全局替换标记,确保所有符合条件的令牌都被逐一替换
执行这个命令后,输入/abc/bcd/cde/会被转换成/../../../,也就是你需要的/../../../。
扩展:处理更复杂的输入场景
如果你的输入可能包含空令牌(比如//abc//),这个命令也能兼容处理,会把//转换成/../,最终得到/../abc/../,完全符合替换逻辑。
内容的提问来源于stack exchange,提问作者rph
相关产品推荐
相关产品推荐

