我有一个包含重复文本块的文件(这些块超过 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// }'