Trier les lignes en regroupant les lignes en retrait avec leur parent

J'ai une list de lignes de l'index d'un livre, disons

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

Maintenant, je veux sortinger ces lignes de la manière la plus évidente: je veux regrouper tous les "parent" -input ( day , night , eve ) avec leurs inputs respectives "enfant" ( satur- , satur- , …) et les sortinger groupes par leur input parent. Je veux aussi sortinger les inputs enfant dans un groupe donné.

Ainsi, la sortie désirée est:

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

Comment pourrais-je y parvenir en utilisant des outils de base unix comme sort ?

Vous pouvez choisir un caractère peu probable dans votre file text, append le nom parent + ce caractère à chaque ligne enfant, sortinger puis supprimer le nom parent et le séparateur de chaque ligne enfant, par exemple avec gnu sed et un caractère ascii bas comme \x02

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

Comment ça marche:
le 1er sed fait ce qui suit:
/^[^[:blank:]]/h – copy des lignes non indentées (parents) sur l'espace de cale
//!G – sur les lignes indentées (enfants) append le contenu de l'espace de retenue à l'espace des motifs
s/\(.*\)\n\(.*\)/\2\x02\1/ – intervertir les lignes dans l'espace des motifs en remplaçant \n ewline par \x02
après cela, sort et supprimer tout ce qui inclut \x02 avec un second sed 's/.*\x02//'