Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在regexp之后更改行的一部分_Linux_Bash_Sed_Awk - Fatal编程技术网

Linux 在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" } ...... ...... 我可以分别

如何在regexp之后更改行的一部分

我有一个文件,需要在其中动态修改带有
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””/