如何解决sed替换文本中连续||模式仅替换一次的问题
问题原因
sed 默认的全局替换为非重叠匹配,扫描字符串时匹配到一组||后,下一次扫描会从本次匹配的结束位置开始。对于|||的场景,前两个|被替换为|0|后,扫描指针移动到第二个|之后,仅剩的单个|无法再形成匹配,因此只会替换一次。
优化方案
方案1:sed 循环替换
借助 sed 的t命令实现循环匹配,只要当前行存在可替换的||就重复执行替换逻辑:
echo '1|2|3|||' | sed -e ':loop' -e 's/||/|0|/g' -e 't loop'
执行后输出结果为1|2|3|0|0|,符合需求。
方案2:awk 字段处理
直接按分隔符|拆分字段,将空字段替换为0后重新拼接,逻辑更直观,对任意长度的连续|都能正确处理:
echo '1|2|3|||' | awk 'BEGIN{FS=OFS="|"}{for(i=1;i<=NF;i++) if($i=="") $i=0}1'
内容的提问来源于stack exchange,提问作者abacus
相关产品推荐
相关产品推荐

