![如何匹配字符串的开头,然后使用 bash 中的模式替换某些值](https://linux22.com/image/211567/%E5%A6%82%E4%BD%95%E5%8C%B9%E9%85%8D%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E5%BC%80%E5%A4%B4%EF%BC%8C%E7%84%B6%E5%90%8E%E4%BD%BF%E7%94%A8%20bash%20%E4%B8%AD%E7%9A%84%E6%A8%A1%E5%BC%8F%E6%9B%BF%E6%8D%A2%E6%9F%90%E4%BA%9B%E5%80%BC.png)
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
第一个字段中的子字符串和/或其他关键字可能就足够了。上面的内容只会在第三个字段中有更改时才会进行更改=
- 如果您没有更精细地指定目标,则可能会在文件的其他位置发生更改。