使用名称标签编辑重复代码块的特定行

使用名称标签编辑重复代码块的特定行

我有一个包含重复文本块的文件(这些块超过 100 个!)。每个重复块都有相同的行数,我只想 在所有 AB_* 块中替换NodeNames, N1 N2 N3 N4 N5 为。 NodeNames, N1 N2 N3 N4(*这里指的是特定AB块的具体id)。

该文件的格式如下:

DeviceName,  AB_12445
line 2
<empty line)
line 3
line 4
line 5
empty line
line 6
line 7
empty line
NodeNames, N1 N2 N3 N4 N5
line 9


DeviceName,  AB_0483
..
..
..
NodeNames, N1 N2 N3 N4 N5
line 9

特定 AB 块(例如 AB_0483)的所需输出为:

DeviceName,  AB_0483
..
..
..
NodeNames, N1 N2 N3 N4
line 9

我想将包含更新的块以及未受影响的块的整个输出保存到新文件中。

答案1

根据评论,我更新了命令。

awk '/AB_/{a=1}!a{print;next}a{if($0!~/NodeNames/){print}else{a=0;printf("NodeNames, N1 N2 N3 N4\n")}}' input > output

答案2

欢迎来到 StackExchange。我相信这涵盖了它。本质上是设置一个标志变量“ab”来指示我们是否处于受影响的块中。然后,如果在“ab”块中,则根据需要替换有问题的 NodeNames 行。

许多其他方法可以实现您所追求的目标:我给出的示例答案相当冗长+冗长。预计其他人很快就会提供一个聪明+神秘的俏皮话。

$ cat foo.awk
{
 if($1=="DeviceName," && $2 ~ /^AB/) { ab=1 }
 if($1=="DeviceName," && $2 !~ /^AB/) { ab=0 }
 if($0=="NodeNames, N1 N2 N3 N4 N5" && ab==1) {
  $0="NodeNames, N1 N2 N3 N4"
 }
 print $0
}

用法示例:

awk -f foo.awk myfile

答案3

这是一个sed解决方案:

 sed '/DeviceName, *AB_12445/, /DeviceName, *AB_/ { /NodeNames/s/ N5// }'

相关内容