如何使用sed仅替换仅含单组|||且无多余管道符的行中的|||?
原命令存在的问题
你之前使用的全局替换命令sed -i 's/|||/|||||||/g' input.txt未添加行级判断条件,会对全文件中所有出现|||的位置无差别执行替换,不管该行是否存在其他零散管道符,因此会错误修改第二行中带分散管道符的内容。
替换的核心判断规则
要精准命中需要执行替换的行,必须同时满足两个要求:
- 该行内仅存在一段连续的3个管道符
||| - 整行除了这段连续的
|||之外,不存在任何其他单独或成组的管道符
正确的sed命令写法
只需在替换规则前增加符合上述条件的行匹配锚点,仅对命中的行执行替换即可:
sed -i '/^[^|]*|||[^|]*$/ s/|||/|||||||/' input.txt
命令逻辑说明
- 匹配锚点
/^[^|]*|||[^|]*$/的执行逻辑:^从行开头开始匹配[^|]*匹配任意数量的非管道符字符- 中间的
|||是必须命中的连续三个管道符片段 [^|]*$匹配完连续三个管道符后,剩余内容全部为非管道符,直到行尾结束
- 该锚点会自动排除所有带有零散管道符、多段管道符的行,仅对符合要求的行执行替换操作。
样例输入的替换效果
针对你给出的样例数据集,执行命令后的输出表现为:
- 第一行
100 S|||:完全符合匹配条件,执行替换后变为100 S||||||| - 第二行
100 S|d1|||88|||:存在分散的独立管道符,不符合匹配条件,不做任何修改 - 第三行
100 S|0d|f6||f630|589f||:不存在连续三个的管道符片段,不符合匹配条件,不做任何修改
内容的提问来源于stack exchange,提问作者Abhinav Dhiman
相关产品推荐
相关产品推荐

