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



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

我有一个文件,我需要在其中修改包含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;而(&ltSTDIN>( {        卒咯��        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

相关内容

最新更新