Linux 在regexp之后更改行的一部分
如何在regexp之后更改行的一部分 我有一个文件,需要在其中动态修改带有Linux 在regexp之后更改行的一部分,linux,bash,sed,awk,Linux,Bash,Sed,Awk,如何在regexp之后更改行的一部分 我有一个文件,需要在其中动态修改带有name=的行,但只有一个位于带有cluster{的行之后。该文件如下: cluster { name = "Some _ Name" owner = "Cavendish Laboratory" ..... ..... } module { name = "core_metrics" } service { name = "ssh_check" } ...... ...... 我可以分别
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"
.....
.....
}
我该怎么做?干杯!以下是我该如何“用语言”做到这一点:
1) 读每一行
2) 每当线条模式匹配cluster{
,设置一个布尔变量wasClusterLine=true
3) 在下一行中,如果wasClusterLine
为true,则在当前行中执行name=
reg ex replace
4) 设置wasClusterLine=false
,因为您只想在cluster{
之后立即执行reg ex replace
希望能有帮助!这里有一个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";
}
严格使用;
我的$wasClusterLine=0;
while(<STDIN>){
大口大口;
如果($wasClusterLine==1){
$\uz=~s/name=.*/name=“工作节点”/g;
}
$wasClusterLine=0;
如果($\ux=~/cluster/){
$wasClusterLine=1;
}
打印“$\u\n”;
}
这可能适合您:
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{/,/}/
- 用
代替new
old
s/name=“”“$old””/name=“”“$new””/
- 这里有一个Perl单行程序:
perl -ple 'do {$_ =~ s/name = .*/name = "Worker Nodes"/; $flag = 0} if $flag; $flag = 1 if $_ =~ /cluster/' inputfile
这是一个非常简洁的解决方案,但我一直在寻找更像“一行程序”的解决方案。干杯!!太棒了!!效果很好。现在,如何对
“what ever it is”
字符串执行相同的操作,而不是静态值,例如,在本例中,一些uu名称
。我尝试了[a-z].*
无效。干杯!!将s
命令更改为s/name=“[^”]*“/name=“”“$new””/