在正则表达式后更改一行的一部分

时间:2012-05-18 13:02:22

标签: linux bash sed awk

如何在正则表达式后更改行的一部分?

我有一个文件,我需要在其中使用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"
  .....
  .....
}

我该怎么做?干杯!

3 个答案:

答案 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