如何使用sed打印由空行分隔的文件部分的某些行

How to print certain lines from sections of a file separated by a blank line with 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

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

我会为此使用 awk,例如:

awk '(!NF&&m=NR)||NR-m==2||NR-m==4' file

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

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

line 2
line 4

line 2
line 4

引用the POSIX standard:

If RS is null, then records are separated by sequences consisting of a <newline> plus one or more blank lines, leading or trailing blank lines shall not result in empty records at the beginning or end of the input

如果你不想在最后一条记录后打印空行:

$ awk 'BEGIN{RS=""; FS=OFS="\n"} NR>1{print prev ORS} {prev= OFS } 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

这可能适合您 (GNU sed):

sed -n '/\S/{n;p;n;n;p;:a;n;//ba;p}' file

为显式打印设置-n 选项。打印第二行和第四行,然后丢弃所有非空行并打印第一行空白行。重复。