Bash

行開始字元串和結束字元串匹配然後它需要替換一行的結束字元串並忽略同一行之間匹配的任何字元串

  • July 16, 2022

以下問題需要一個 shell 腳本

elecj_test: |1009676|F|269.13348200|3|348415|237.06|0.00|0.00|||SSPPPSSSPSSS|未測試||

如果一行以elecj_test:開頭並以||結尾 它需要替換為**| |**

這里之間添加了空格**| |**

如果找到,則在該行的中間**||** 它不能只替換它必須在行尾替換。

這是我的 sed 命令,可||根據要求編輯結尾:

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

匹配從 “elecj_test:” 開始到 “||” 結束,擷取到(但不包括)最後的 “|” 的行 帶括號,並替換為擷取的字元串,後跟空格和“|”,並列印編輯的行。

它沒有參數化以適應不同的開始/結束字元串,所以可能不是一個高質量的答案,但也許你需要一個快速的一次性命令。

使用awk,使用管道作為欄位分隔符:

  • 測試第一個欄位是否等於“elecj_test:”,最後一個欄位為空,第二個欄位為空。
  • 如果為真,則將倒數第二個欄位設置為空格。
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| |

引用自:https://unix.stackexchange.com/questions/710006