如何使用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
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
选项。打印第二行和第四行,然后丢弃所有非空行并打印第一行空白行。重复。
我一直在尝试想出一个 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
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
选项。打印第二行和第四行,然后丢弃所有非空行并打印第一行空白行。重复。