如何在正则表达式后更改行的一部分?
我有一个文件,我需要在其中修改包含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"
.....
.....
}
我该怎么做?干杯!
对你有用:
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"'"/
以下是我如何"用文字"做到这一点:
1( 阅读每一行
2(每当线型匹配cluster {
时,设置一个布尔变量wasClusterLine = true
3(在下一行,如果wasClusterLine
为真,则在当前行上替换您的name =
正则表达式
4(设置wasClusterLine = false
,因为你只想在cluster {
之后立即在线上做你的正则表达式替换。
希望对您有所帮助! 这是一个perlscript,应该执行我上面描述的操作。
使用严格;我的$wasClusterLine = 0;而(<STDIN>( { 卒咯�� if($wasClusterLine == 1( { $_ =~ s/name = .*/name = "工作节点"/g; } $wasClusterLine = 0; if($_ =~/cluster/( { $wasClusterLine = 1; } 打印"$_";}
下面是一个 Perl 单行代码:
perl -ple 'do {$_ =~ s/name = .*/name = "Worker Nodes"/; $flag = 0} if $flag; $flag = 1 if $_ =~ /cluster/' inputfile