J'ai un fichier contenant du texte dans les paragraphes (lignes avec du texte séparé par une ou plusieurs lignes vides). Je voudrais inverser l'ordre des paragraphes (c'est-à-dire que le dernier paragraphe deviendra le premier, ...), de préférence en utilisant sed.
Je recherche une commande sed qui ferait un fichier de paragraphes, que tac
ferait un fichier de lignes.
la source
Il pourrait y avoir un moyen de le faire
sed
, mais je doute que ce soit simple. Voici comment je le ferais en Perl:Cela fonctionne car la définition du séparateur d'enregistrements d'entrée comme le caractère nul (
-00
) indique à Perl de fonctionner en mode paragraphe. La définition de Perl d'un paragraphe 1 correspond exactement à votre définition.1 Regardez sous le titre
Other values for $/
la source
Si vos paragraphes sont toujours séparés par une seule ligne vide:
Il est assez facile de voir comment cela fonctionne si vous le divisez en morceaux et exécutez
sed '/^$/s/^/\x02/' infile
ensuitesed '/^$/s/^/\x02/' infile | tr \\n$'\002' $'\003'\\n
et ainsi de suite ...Si vos paragraphes sont séparés par une ou plusieurs lignes vides, par exemple
et vous souhaitez inverser l'ordre des paragraphes mais conserver l'ordre des "blocs vides", vous pouvez lire le fichier deux fois:
1er: transformer les paragraphes en lignes simples (en supprimant les blocs vides entre les deux) et les inverser et
2e: tourner les blocs vides en lignes simples, "indexant" le nombre de lignes vides dans chaque bloc (et supprimant les lignes non vides)
puis
paste
les résultats et traitent la sortie pour restaurer les retours à la ligne:qui génère:
Si cela ne vous dérange pas une ligne de fin supplémentaire dans la sortie, vous pouvez supprimer la dernière
sed
:Ceux-ci supposent que la première et la dernière ligne ne sont pas vides (et non
\x02
,\x03
ou\x04
dans l'entrée).la source
Vous POUVEZ le faire avec une seule instance de
sed
; aucun tuyau nécessaire. Étant donnésed
qu'un seul passage dans le document et que la partie du fichier requise au début de la sortie se trouve à la fin du fichier, il faudra conserver l'intégralité du fichier en mémoire à l'intérieursed
(dans l'espace d'attente). pas bien à l'échelle. Mais cela répond exactement à la question:S'il n'y a pas de nouvelle ligne de fin, cela fonctionne toujours bien. S'il n'y a qu'une seule nouvelle ligne de fin, elle est supprimée dans la sortie (c'est-à-dire qu'il n'y aura pas de nouvelle ligne principale dans la sortie). S'il y a (par exemple) 5 sauts de ligne de fin dans l'entrée, il y aura 4 sauts de ligne de début dans la sortie.
Les écarts entre les paragraphes sont préservés.
Les espaces sur une ligne autrement vide ne sont PAS traités comme un saut de paragraphe, mais c'est une fonctionnalité, pas un bogue. :)
Vous pouvez également le faire en tant que doublure beaucoup moins lisible:
Bien que cela ne fonctionne qu'avec GNU
sed
. (Notez l'utilisation délicate des références arrières pour effectuers/$/\n/
. Sans cela, ce ne serait pas une ligne simple littérale car elle contiendrait une nouvelle barre oblique inversée.)la source
G;h
. vous pourriez mentionner quelque chose sur les restrictions d'entrée ou similaire.sed
portée de main, mais la version du script conserve définitivement les espaces entre les paragraphes. Je viens de le tester sur votre entrée. Avez-vous testé la version du script?Cela devrait préserver l'espacement de vos paragraphes (tout en étant plus lisible que
sed
:)).la source