sed,awk或类似 - 如果模式匹配后跟空行,则删除整行和上面的2行

时间:2017-02-10 16:52:32

标签: linux bash awk sed

示例文字:

DATE(eu.updated)

我想删除中间没有任何数据的部分。那是;如果heading2后跟一个空行,则删除heading2,heading1和上面的空行。

我已经找到了如何仅在后面跟一个空行删除行,以及如何删除模式上/下的n行,但无法解决如何合并这两行。

感谢。

3 个答案:

答案 0 :(得分:8)

您可以使用awk

awk 'BEGIN{RS=ORS="\n\n";FS="\n"} NF>2' input.file

虽然awk默认情况下按行进行操作,但记录不一定需要是一行。使用RS输入记录分隔符),您可以定义记录的分隔方式。

我将RS块中的BEGIN设置为空白行,以便按段落分隔记录,将FS分隔为换行符,以换行符分隔字段。

NF成立是当前记录中的字段数。 NF>2检查包含2行以上的任何记录 - 如果满足此条件,awk将打印记录。

ORS输出记录分隔符。我将其设置为空行,如FS,以便将输出中的各个记录分开。

答案 1 :(得分:2)

这是一种类似的方法,可以消除打印最后一个空行:

awk -v RS= 'NF>2{print sep $0; sep=ORS}' file

答案 2 :(得分:1)

这可能适合你(GNU sed):

sed ':a;N;/^$/M!ba;s/\n/&/3;t;d' file

在模式空间中存储由空行分隔的记录。如果记录包含3个或更多新行,则将其删除。