awk -v RS= -v cmd=sort '{print | cmd; close(cmd); print ""}' file
レコードセパレータRSを空の文字列に設定すると、一度に段落のawkステップが実行されます。各段落について、段落を($0)でcmd(これはに設定されていますsort)にパイプし、出力を印刷します。空白行を印刷して、出力段落をで区切りprint ""ます。
perlの例を挙げている場合は、Stephaneのアプローチとは別のアプローチを示します。
perl -e 'undef $/; print join "\n", sort (split /\n/), "\n"
foreach(split(/\n\n/, <>))' < file
フィールド区切り記号(undef $/)<>を設定解除すると、STDIN全体を使用および取得できます。私たちはsplitそれから\n\n(段落)。foreach「段落」、sortによって行split改行周りティン、sortINGの、その後join一緒に戻ってそれらをINGのと後ろにタック\n。
ただし、これには、最後の段落に「末尾の段落」区切り文字が追加されるという副作用があります(前にない場合)。あなたは少しかわいくないでそれを回避することができます:
perl -e 'undef $/; print join "\n", sort (split /\n/) , (\$_ == \$list[-1] ? "" : "\n")
foreach(@list = split(/\n\n/, <>))' < file
これにより、段落がに割り当てられます@list。次に、それがforeach(\$_ == \$list[-1]チェック)の最後の要素であるかどうかをチェックする「3項演算」があります。""(? ...)の場合は印刷、それ以外の場合は()他のすべての「段落」(の要素: ...)を印刷"\n"します@list。
awkを回避するソリューションについて、あなたにも感謝しますsort!卑劣!