如何匹配字符串的开头,然后使用 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 个虚拟机,我希望它为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用于编辑文件in-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第一个字段中的子字符串和/或其他关键字可能就足够了。上面的内容只会在第三个字段中有更改时才会进行更改=- 如果您没有更精细地指定目标,则可能会在文件的其他位置发生更改。

相关内容