1

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

我有一个文件,我需要在其中修改行(动态),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"
  .....
  .....
}

我怎么做?干杯!

4

3 回答 3

1

这是我“用文字”做的方式:

1)阅读每一行

2) 每当一行模式匹配cluster {时,设置一个布尔变量wasClusterLine = true

3)在下一行,如果wasClusterLine是真的,那么你的正则name =表达式替换当前行

4) set wasClusterLine = false,因为你只想在cluster {.

希望有帮助!这是一个应该执行我上面描述的 perlscript。

使用严格;
我的 $wasClusterLine = 0;
而(<标准输入>){
        咀嚼$_;

        if($wasClusterLine == 1) {
                $_ =~ s/name = .*/name = "工作节点"/g;
        }
        $wasClusterLine = 0;

        if($_ =~ /cluster/) {
                $wasClusterLine = 1;
        }

        打印“$_\n”;
}
于 2012-05-18T13:21:36.340 回答
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"'"/
于 2012-05-18T13:36:43.787 回答
1

这是一个 Perl 单行代码:

perl -ple 'do {$_ =~ s/name = .*/name = "Worker Nodes"/; $flag = 0} if $flag; $flag = 1 if $_ =~ /cluster/' inputfile
于 2012-05-18T22:00:49.613 回答