文字列の先頭を一致させ、bashでパターンを使用して特定の値を置き換える方法

文字列の先頭を一致させ、bashでパターンを使用して特定の値を置き換える方法
vm0 host=10.182.35.1 controller=True
vm1 host=10.182.35.2 controller=False solution=abc
vm2 host=10.182.35.3 controller=True solution=abc
vm3 host=10.182.37.4 controller=False solution=xyz
vm4 host=10.182.37.5 controller=True solution=abc
vm5 host=10.182.35.6 controller=True solution=aaa
vm6 host=10.182.37.7 controller=False solution=bbb

上記のテストはファイルにありますfile1.txt。次のように変更したいと思います。

  • 最初の3つのVMについてはcontroller=True
  • 後続のすべてのVM(3番目のVMから始まる)はcontroller=False

上記のコードスニペットには前後に何かがあるため、行番号を使用してこれを行うことはできません。

文字列の先頭を一致させ、それに応じて変更する必要があります。

したがって、出力は次のようになります

vm0 host=10.182.35.1 controller=True
vm1 host=10.182.35.2 controller=True solution=abc
vm2 host=10.182.35.3 controller=True solution=abc
vm3 host=10.182.37.4 controller=False solution=xyz
vm4 host=10.182.37.5 controller=False solution=abc
vm5 host=10.182.35.6 controller=False solution=aaa
vm6 host=10.182.37.7 controller=False solution=bbb

ファイルを変更するには?

答え1

私は以下を使用しますperl

perl -pe 's/controller=\K\w+/++$n <= 3 ? "True" : "False"/e if /^vm\d+\s/' file

-in-placeファイル編集iオプションが追加されました。

答え2

awkパターンの開始が一致した場合、フラグを設定して開始行を変数に保持できます。

その後、フラグ自体の発生とその行番号の数に応じて変更が適用されます。

awk '$1=="vm0" {a=NR}
     a && NR<a+3 {sub(/=.*/,"=True",$3)}
     a && NR>=a+3 {sub(/=.*/,"=False",$3)}
     1' infile

いつ停止するかについてのヒントは定義されていませんが、vm最初のフィールドで部分文字列や他のキーワードを確認するだけで十分です。上記は、3番目のフィールドに変更がある場合にのみ変更されます。=ターゲットをより詳細に指定しないと、ファイル内の他の場所で変更される可能性があります。

関連情報