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 个虚拟机,我希望它为
controller=True
. - 所有后续虚拟机(从第 3 个开始)都应该是
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
用于编辑文件i
n-place 的选项。
答案2
awk
一旦匹配了模式的开头,您就可以设置一个标志,并将起始行保留在变量中。
然后根据标志本身的出现及其行号计数来应用更改。
awk '$1=="vm0" {a=NR}
a && NR<a+3 {sub(/=.*/,"=True",$3)}
a && NR>=a+3 {sub(/=.*/,"=False",$3)}
1' infile
您没有定义任何关于何时停止的提示,但也许检查vm
第一个字段中的子字符串和/或其他关键字可能就足够了。上面的内容只会在第三个字段中有更改时才会进行更改=
- 如果您没有更精细地指定目标,则可能会在文件的其他位置发生更改。