要删除1个或多行符合模式的行吗?

时间:2018-07-18 17:30:50

标签: text-editor

我正在尝试弄清楚如何编辑供稿器txt文件。以前,我能够通过使用通配符使用Word的替换功能来完成此任务。但是,最新的供稿器文件似乎太大,无法在Word中打开。因此,我不得不寻找其他方式来替换文本。

文件看起来像这样:

VSTHDR|data|data|data|data
...
VSTPMTH|data|1|
CRDHLDR|data|data|data
ADDR|data|data|data
VSTPMTR|data|data
VSTPMTA|data|
VSTPMTA|data
VSTPMTH|data|2|
CRDHLDR|data|data|data
VSTPMTR|data|data
VSTPMTH|data|3|
VSTPMTR|data|data
VSTPMTA|data
...
VST...
...
ADDR|data|data|data

并重复。对于除最后一个VSTPMTH之外的所有内容,总会有CRDHLDR行。在CRDHLDR下,可能有也可能没有ADDR线。然后总是有一个VSTPMTR。可能有也可能没有VSTPMTA行。在下一个VSTHDR之前,会有更多的行以VST开头,最后以另一条ADDR结束。

我的目标是删除所有CRDHLDR线以及紧随其后的所有ADDR线。在Word中,我能够使用“ VSTPMTR”替换所有“ CRDHLDR * VSTPMTR”。

我以为我拥有

sed '/CRDHLDR/,/^[^V]/d'

但是,如果紧接着没有ADDR线,它将删除后面的所有VST线。

我的另一个想法是尝试将以ADDR开头的任何行添加到它前面的行中,然后再回去删除任何CRDHLR行,然后在任何剩余的ADDR之前重新添加换行符。但是,我发现的用于合并行的所有脚本似乎都受保持缓冲区大小的限制,该文件很快就超过了该大小。如果您能想到一组尝试减少缓冲区使用量的命令,我会很乐意尝试。

到目前为止,我能找到的最接近的解决方案是运行:

sed '/CRDHLDR/,/VSTPMTR/d'

但是删除了我不想删除的VSTPMTR。如果我能删除该选择的最后一行(而不是整个选择),那么那将是完美的。

我还没有看到任何看起来很正确的grep或awk解决方案,但是我愿意尝试任何建议。

1 个答案:

答案 0 :(得分:0)

我想我找到了两个步骤的答案:

sed '/CRDHLDR/,/VSTPMTR/ {ADDR/d}'
sed '/CRDHLDR/d'

第一行删除CRDHLDR和VSTPMTR之间的ADDR线,然后第二行删除所有CRDHLDR线。