首页 > 解决方案 > 如何使用 sed 从由空行分隔的文件部分打印某些行

问题描述

我一直在尝试提出一个 sed 命令,该命令将从文件中由空白行分隔的文本块中提取某些行。文本块如下。

# cat test_file.txt
line 1
line 2
line 3
line 4
line 5

line 1 
line 2
line 3
line 4
line 5

line 1 
line 2
line 3
line 4
line 5

我试图从每个块中拉出第 2 行和第 4 行,因此输出将如下所示。

line 2
line 4

line 2
line 4

line 2 
line 4

我想出了一种方法来使用 sed 处理第一块文本:

# sed -n -e 2p -e 4p test_flie.txt
line 2
line 4

但是一直无法找到一种方法让它继续为每个文本块直到文件末尾。任何指针将不胜感激。

标签: awksedfile-manipulation

解决方案


awks 段落模式专门用于处理空白行分隔的记录/文本块,就像您正在处理的那样:

$ awk 'BEGIN{RS=""; ORS="\n\n"; FS=OFS="\n"} {print $2, $4}' file
line 2
line 4

line 2
line 4

line 2
line 4

参考POSIX 标准

<newline>如果 RS 为空,则记录由一个或多个空行组成的序列分隔,前导或尾随空行不应导致输入的开头或结尾处为空记录

如果您不需要在最终记录后打印空行:

$ awk 'BEGIN{RS=""; FS=OFS="\n"} NR>1{print prev ORS} {prev=$2 OFS $4} END{print prev}' file
line 2
line 4

line 2
line 4

line 2
line 4

或者如果您出于某种原因不想使用段落模式,那么:

$ awk 'BEGIN{tgts[2]; tgts[4]} !NF{print ""; lineNr=0; next} ++lineNr in tgts' file
line 2
line 4

line 2
line 4

line 2
line 4

推荐阅读