如何在正则表达式后更改行的一部分?
我有一个文件,我需要在其中使用name =
修改该行(动态),但只有cluster {
之后的行。{该文件是这样的:
cluster {
name = "Some _ Name"
owner = "Cavendish Laboratory"
.....
.....
}
module {
name = "core_metrics"
}
service {
name = "ssh_check"
}
......
......
我可以单独执行这两项任务,例如:
sed -n '/cluster\ {/{n;p;}' # next line after cluster
sed -ic "/name\ =\ /{s:OLD:NEW:g}" # replace OLD with NEW on the fly
但是如何将这两者结合起来得到最终结果:?
cluster {
name = "Worker Nodes"
owner = "Cavendish Laboratory"
.....
.....
}
我该怎么做?干杯!
答案 0 :(得分:1)
以下是我用文字表达的方式:
1)阅读每一行
2)每当线条模式匹配cluster {
时,设置一个布尔变量wasClusterLine = true
3)在下一行,如果wasClusterLine
为真,那么在当前行上执行name =
reg-ex替换
4)设置wasClusterLine = false
,因为您只想在cluster {
之后立即对该行进行注册替换。
希望有所帮助!这是一个perlscript应该做我上面描述的。
use strict; my $wasClusterLine = 0; while(<STDIN>) { chomp $_; if($wasClusterLine == 1) { $_ =~ s/name = .*/name = "Worker Nodes"/g; } $wasClusterLine = 0; if($_ =~ /cluster/) { $wasClusterLine = 1; } print "$_\n"; }
答案 1 :(得分:1)
这可能对您有用:
old="Some _ Name" new="Worker Nodes"
sed '/cluster {/,/}/s/name = "'"$old"'"/name = "'"$new"'"/' file
cluster {
name = "Worker Nodes"
owner = "Cavendish Laboratory"
.....
.....
}
module {
name = "core_metrics"
}
service {
name = "ssh_check"
}
......
......
cluster {
和}
之间的界限。 /cluster {/,/}/
new
替换为old
s/name = "'"$old"'"/name = "'"$new"'"/
答案 2 :(得分:1)
这是一个Perl单行:
perl -ple 'do {$_ =~ s/name = .*/name = "Worker Nodes"/; $flag = 0} if $flag; $flag = 1 if $_ =~ /cluster/' inputfile