假设我有三个小段落,字数为 100 多一点,我如何只显示最后一段?
答案1
您可以使用awk
段落模式(当RS
为空时;段落由空行序列分隔,忽略前导和尾随空行):
awk -v RS= 'END{print}' < file.txt
请注意,如果输入文件不包含任何段落(为空或仅包含空行),它将打印空行。为了防止这种情况,您可以将上面的内容更改为:
awk -v RS= 'END{if (NR) print}' < file.txt
(NR
是数量记录(在这种情况下段落)在文件中)。
答案2
假设您的段落由空行分隔,则以下命令应该有效(将三个“测试”实例替换为您的文件名):
tail -n `expr $(wc -l test | cut -f1 -d' ') - \
$(grep -ERn '^$' test | tail -n1 | grep -o '[0-9]\+')` test
我很确定有一个更简单的解决方案,在这里我正在寻找最后一个空白行grep -ERn '^$' test | tail -n1
并删除第一个空白行之前的所有内容tail
答案3
假设您的输入中没有尾随空行,您可以运行:
sed 'H;/^$/h;$!d;x' infile
这会用每个段落的内容覆盖保留空间,删除模式空间,除非在交换缓冲区的最后一行上。请注意,您将在输出中得到一个前导空行,但这很容易删除......我将把它作为练习留给您。
答案4
详细阐述船长帽的答案,你可以做一些更简单的事情awk
:
tail -n$(tac myFile.txt | awk '/^$/{print NR-1; exit}') myFile.txt
假设段落由空行分隔(或仅包含空格)。
tac
编辑:在和之间感到困惑rev
,你需要使用tac
它才能真正工作。
编辑:如果您担心文件中的尾随空行,可以使用以下方法来解决它们awk
:
tail -n $(tac myFile.txt | \
awk 'BEGIN{i=1} /^$/{if (NR == i) {i++} else {print NR-1; exit}}') \
myFile.txt
测试了一下,似乎可以按预期工作!