首页 > 解决方案 > 文件字符匹配和添加字符shell脚本

问题描述

我有一个格式如下的文件

ABD|66732|987|01/06/2019 10:00|I
ABD|66732|927|01/06/2019 10:01|I
ABD|66732|W917|01/06/2019 10:02|I
ABD|66732|947|01/06/2019 10:03|I
ABD|66732|W977|01/06/2019 10:04|I
ABD|66732|997|01/06/2019 10:05|I

我想在第二个 '|' 之后加上前缀 'W' 如果 W 不存在,则在每一行上。我需要使用 bash 脚本来执行此操作。我尝试使用 sed 并且可以替换,但是如何使用 sed 有条件地替换?

标签: regexshellsed

解决方案


awk更适合基于字段的处理:

$ awk 'BEGIN{FS=OFS="|"} {sub(/^[^W]/, "W&", $3)} 1' ip.txt
ABD|66732|W987|01/06/2019 10:00|I
ABD|66732|W927|01/06/2019 10:01|I
ABD|66732|W917|01/06/2019 10:02|I
ABD|66732|W947|01/06/2019 10:03|I
ABD|66732|W977|01/06/2019 10:04|I
ABD|66732|W997|01/06/2019 10:05|I
  • BEGIN{FS=OFS="|"}设置|为输入和输出字段分隔符
  • sub(/^[^W]/, "W&", $3)仅搜索并替换第三个字段的第一个匹配项
    • ^[^W]仅当第三个字段的第一个字符不是时才有效W
    • W&添加W作为匹配字符的前缀

推荐阅读