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
-i
n-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番目のフィールドに変更がある場合にのみ変更されます。=
ターゲットをより詳細に指定しないと、ファイル内の他の場所で変更される可能性があります。