Mar*_*ter 8 sed text-processing
我有一个包含段落文本的文件(文本行由一个或多个空行分隔)。我想颠倒段落的顺序(即最后一段将成为第一段,...),最好使用 sed。
我正在寻找一个 sed 命令,它可以对一个段落文件tac
执行什么操作,对一个行文件执行什么操作。
使用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 解决方案)需要在输入文件的末尾有一个空行才能按预期工作。
此解决方案使用tac
和 一次perl
阅读一个段落。它不需要将整个文件读入内存。
tac file | perl -00 -lpe '$_ = join "\n", reverse split /\n/'
Run Code Online (Sandbox Code Playgroud)
反转文件的所有行,然后对于每个反转的段落,反转行。