名前タグを使用して繰り返されるコードブロックの特定の行の編集

名前タグを使用して繰り返されるコードブロックの特定の行の編集

繰り返しテキストブロック(100以上のブロック)を含むファイルがあります。各繰り返しブロックには同じ数の行があり、すべてのブロックでAB_ *を置き換えたいと思いますNodeNames, N1 N2 N3 N4 N5NodeNames, N1 N2 N3 N4(*特定のABブロックの特定IDを示します。)

このファイルの形式は次のとおりです。

DeviceName,  AB_12445
line 2
<empty line)
line 3
line 4
line 5
empty line
line 6
line 7
empty line
NodeNames, N1 N2 N3 N4 N5
line 9


DeviceName,  AB_0483
..
..
..
NodeNames, N1 N2 N3 N4 N5
line 9

特定のABブロック(例:AB_0483)に必要な出力は次のとおりです。

DeviceName,  AB_0483
..
..
..
NodeNames, N1 N2 N3 N4
line 9

更新されたチャンクと影響を受けないチャンクを含む出力全体を新しいファイルに保存したいと思います。

答え1

コメントに基づいてコマンドを更新しました。

awk '/AB_/{a=1}!a{print;next}a{if($0!~/NodeNames/){print}else{a=0;printf("NodeNames, N1 N2 N3 N4\n")}}' input > output

答え2

StackExchangeへようこそ。私はこれがそれをカバーすると信じています。デフォルトでは、私たちが影響を受けるブロックにあるかどうかを示すためにフラグ変数 "ab"を設定します。次に、「ab」ブロック内にある場合は、必要に応じて問題になるNodeNames行を置き換えます。

欲しいものを達成する他の方法はたくさんあります。私が提示した答えの例はやや長くて冗談です。他の人がすぐに賢く、秘密の冗談を提案することを期待してください。

$ cat foo.awk
{
 if($1=="DeviceName," && $2 ~ /^AB/) { ab=1 }
 if($1=="DeviceName," && $2 !~ /^AB/) { ab=0 }
 if($0=="NodeNames, N1 N2 N3 N4 N5" && ab==1) {
  $0="NodeNames, N1 N2 N3 N4"
 }
 print $0
}

使用例:

awk -f foo.awk myfile

答え3

解決策は次のとおりですsed

 sed '/DeviceName, *AB_12445/, /DeviceName, *AB_/ { /NodeNames/s/ N5// }'

関連情報