ファイル内の文字列(Name2)を見つけ、次の行でバージョン(* abc-xyz-0-197)を一致させ、増分値でID行を更新しようとしています。
これはどのように達成できますか?
ファイルは次のようになります。
Name1:
version: *abc-xyz-0-197
ID: 1
primary_data:
somedata:
Name2:
version: *abc-xyz-0-196
ID: 3
primary_data:
somedata:
Name3:
version: *abc-xyz-0-192
ID: 6
primary_data:
somedata:
出力は次のようになります。 (名前2とバージョン:* abc-xyz-0-196)
Name1:
version: *abc-xyz-0-197
ID: 1
primary_data:
somedata:
Name2:
version: *abc-xyz-0-196
ID: **4**
primary_data:
somedata:
Name3:
version: *abc-xyz-0-192
ID: 6
primary_data:
somedata:
答え1
入力ファイルの短絡モード処理を有効にするには、空の文字列を使用しawk
て設定します。RS=
awk -v RS= -F'\n' '$1 ~ /^ *Name2:$/ && $2 ~ /^ *version: \*abc-xyz-0-196$/ {
bakline=$0; sub(/.*ID:/,""); newId=$0+1;
$0=bakline"\n"; sub(/ID: [0-9]+/,"ID: " newId);
}1' infile
1行目と2行目が要件と一致することを確認し、一致するチャンクからバックアップし、すべてを削除し、ID:
残りの有効な文字列を増やし、バックアップ変数からチャンクを返し、IDをnewId値に置き換えます。
答え2
ここでは、範囲演算子を使用して,
目的のデータポイントを選択して変更できます。
awk '$1=="Name2:",(!NF) {
if ($2=="*abc-xyz-0-196") f++
if ($1 == "ID:" && f) sub(/[0-9]+/, $2+1)
if (!NF) f=0
}1' file
答え3
perl -00pe 's/Name2:\s*version: \*abc-xyz-0-196\s*ID: \K(\d+)/$1+1/e' ex
どこ:
perl -00pe ...
-->各入力段落ごとに実行および...
印刷s/.../exp/e
-->...
結果として交換eval exp
/...1\K...2/
-->...1
左のコンテキストを取得してバスに置き換えます。...2