行开始字符串和结束字符串匹配,然后需要替换行的结束字符串并忽略同一行之间匹配的任何字符串

行开始字符串和结束字符串匹配,然后需要替换行的结束字符串并忽略同一行之间匹配的任何字符串

需要 shell 脚本来解决以下问题

elecj_test: |1009676|F|269.13348200|3|348415|237.06|0.00|0.00|||SSPPPSSSPSSS|UNTESTED||

如果一行开头为电子测试:并以||它需要替换为| |

这里中间加了空格| |

如果找到则位于该行的中间||它不能替换,只能在行尾替换。

答案1

,使用管道作为字段分隔符:

  • 测试第一个字段是否等于“elecj_test:”,最后一个字段为空,最后第二个字段为空。
  • 如果为 true,则将倒数第二个字段设置为空格。
awk '
  BEGIN { FS = OFS = "|" }
  $1 == "elecj_test: " && $NF == "" && $(NF - 1) == "" {
    $(NF - 1) = " "
    print
  }
' file
elecj_test: |1009676|F|269.13348200|3|348415|237.06|0.00|0.00|||SSPPPSSSPSSS|UNTESTED| |

答案2

||这是我的 sed 命令,它根据要求编辑结尾:

sed -n 's/^\(elecj_test:.*|\)|$/\1 |/p'

匹配以“elecj_test:”开头并以“||”结尾的行,捕获直到(但不包括)最后一个“|”的行带括号,并替换为捕获的字符串,后跟空格和“|”,并打印编辑的行。

它没有参数化以适应不同的开始/结束字符串,因此可能不是高质量的答案,但也许您需要一个快速的一次性命令。

相关内容