msort(1)a été conçu pour pouvoir trier des fichiers avec des enregistrements sur plusieurs lignes. Il a une interface graphique en option, ainsi qu'une version de ligne de commande normale et utilisable pour les humains. (Au moins, les humains qui aiment lire attentivement les manuels et chercher des exemples ...)
AFAICT, vous ne pouvez pas utiliser un modèle arbitraire pour les enregistrements, donc à moins que vos enregistrements soient de taille fixe (en octets, pas en caractères ou en lignes). msorta une -boption pour les enregistrements qui sont des blocs de lignes séparés par des lignes vides.
Vous pouvez transformer votre entrée en un format qui fonctionnera -bassez facilement, en mettant une ligne vierge avant chaque ###...(sauf la première).
Par défaut, il imprime des statistiques sur stderr, donc au moins il est facile de savoir quand il n'a pas été trié car il pensait que l'entrée entière était un seul enregistrement.
msorttravaille sur vos données. La sedcommande ajoute une nouvelle ligne à chaque #+ligne à l'exception de la ligne 1. -wtrie l'enregistrement entier (lexicographiquement). Il existe des options pour choisir la partie d'un enregistrement à utiliser comme clé, mais je n'en avais pas besoin.
J'ai également laissé de côté les nouvelles lignes supplémentaires.
$ sed '2,$ s/^#\+/\n&/' unsorted.records | msort -b -w 2>/dev/null
####################################
KEY1
VAL11
VAL12
VAL13
VAL14
####################################
KEY2
VAL21
VAL22
VAL23
VAL24
####################################
KEY3
VAL31
VAL32
VAL33
VAL34
Je n'ai pas eu de chance -r '#'de l'utiliser comme séparateur d'enregistrements. Il pensait que le dossier entier était un enregistrement.