文件中段落的倒序

Mar*_*ter 8 sed text-processing

我有一个包含段落文本的文件(文本行由一个或多个空行分隔)。我想颠倒段落的顺序(即最后一段将成为第一段,...),最好使用 sed。

我正在寻找一个 sed 命令,它可以对一个段落文件tac执行什么操作,对一个行文件执行什么操作。

dev*_*ull 6

使用sed并不像Joseph R.提到的那么直接。但是,您可以说:

sed '/./{H;d;};x;s/\n/={NL}=/g' inputfile | \
sed -e 's/^={NL}=//' -e '1!G;h;$!d' | \
sed G | sed 's/={NL}=/\'$'\n/g'
Run Code Online (Sandbox Code Playgroud)

给定一个样本输入:

Para 1 line 1
Para 1 line 2
Para 1 line 3

Para 2 line 1
Para 2 line 2
Para 2 line 3

Para 3 line 1
Para 3 line 2
Para 3 line 3
Run Code Online (Sandbox Code Playgroud)

这将产生:

Para 3 line 1
Para 3 line 2
Para 3 line 3

Para 2 line 1
Para 2 line 2
Para 2 line 3

Para 1 line 1
Para 1 line 2
Para 1 line 3
Run Code Online (Sandbox Code Playgroud)

值得一提的是,这个解决方案(以及替代的 Perl 解决方案)需要在输入文件的末尾有一个空行才能按预期工作。


gle*_*man 6

此解决方案使用tac和 一次perl阅读一个段落。它不需要将整个文件读入内存。

tac file | perl -00 -lpe '$_ = join "\n", reverse split /\n/'
Run Code Online (Sandbox Code Playgroud)

反转文件的所有行,然后对于每个反转的段落,反转行。