インデントされた行を親行とグループ化しながら行を並べ替える

インデントされた行を親行とグループ化しながら行を並べ替える

本の索引のような行のリストがあります。

day
    satur-
    sun-
    holy-
night
    ball
    to-
eve
    election
    christmas

ここで、これらの行を明白な方法で並べ替えたいと思います。つまり、すべての「親」エントリ ( day、、) を、それぞれインデントされた「子」エントリ ( 、、 …) とグループ化し、これらのグループを親エントリで並べ替えたいと思います。またnight、任意のグループ内の子エントリも並べ替えたいと思います。evesatur-sun-

したがって、望ましい出力は次のようになります。

day
    holy-
    satur-
    sun-
eve
    christmas
    election
night
    ball
    to-

のような Unix コア ツールを使用してこれを最も効果的に実現するにはどうすればよいでしょうかsort?

答え1

テキストファイルで出現する可能性が低い文字を選択し、親の名前とその文字を各子の行の先頭に追加し、並べ替えてから、各子の行から親の名前と区切り文字を削除します。gnuたとえば、sedとlow ASCII文字を使用します。\x02

sed '/^[^[:blank:]]/h;//!G;s/\(.*\)\n\(.*\)/\2\x02\1/' infile | sort | sed 's/.*\x02//'

動作方法:
1番目はsed以下を実行します:
/^[^[:blank:]]/h- インデントされていない行 (親) をホールドスペースにコピーします
//!G- インデントされた行 (子) では、ホールドスペースの内容をパターンスペースに追加します
s/\(.*\)\n\(.*\)/\2\x02\1/- パターンスペースの行を交換し、\n新しい行を\x02
それ以降の行に置き換え、2番目sortまでのすべてを削除します\x02sed 's/.*\x02//'

関連情報