J'ai l'habitude d'écrire une ligne par phrase car je compile généralement des choses dans LaTex, ou j'écris dans un autre format où les sauts de ligne sont ignorés. J'utilise une ligne vierge pour indiquer le début d'un nouveau paragraphe.
Maintenant, j'ai un fichier écrit dans ce style que je voudrais simplement envoyer en texte brut. Je souhaite supprimer tous les sauts de ligne simples, mais laisser les sauts de ligne doubles intacts. Voici ce que j'ai fait:
sed 's/$^/NEWLINE/' file.txt | awk '{printf "%s ",$0}' | sed 's/NEWLINE/\n\n/g' > linebreakfile.txt
Cela remplace les lignes vides par du texte qui, je suis sûr, n'apparaît pas dans le fichier: NEWLINE
puis il supprime tous les sauts de ligne avec awk (j'ai trouvé cette astuce sur certains sites Web), puis il remplace le NEWLINE
s par les deux sauts de ligne requis .
Cela semble être un long chemin à parcourir pour faire une chose assez simple. Existe-t-il un moyen plus simple? De plus, s'il y avait un moyen de remplacer plusieurs espaces (qui s'introduisent parfois pour une raison quelconque) par des espaces uniques, ce serait bien aussi.
J'utilise emacs, donc s'il y a une astuce spécifique à emacs, c'est bien, mais je préfère voir une version pure sed ou pure awk.
tr -d "\n"
.Réponses:
Vous pouvez utiliser awk comme ceci:
Ou si vous avez besoin d'une nouvelle ligne supplémentaire à la fin:
Ou si vous souhaitez séparer les paragraphes par une nouvelle ligne:
Ces commandes awk utilisent des actions protégées par des modèles:
ou
Une action suivante n'est exécutée que si le motif correspond à la ligne actuelle.
Et les
^$.
caractères ont une signification spéciale dans les expressions régulières, où^
correspond le début de la ligne,$
la fin et.
un caractère arbitraire.la source
/./
passe: il semble agir comme etelse
pour la/^$/
correspondance de chaîne, n'est-ce pas?Utilisez le mode paragraphe Awk ou Perl pour traiter un fichier paragraphe par paragraphe, où les paragraphes sont séparés par des lignes vides.
Bien sûr, puisque cela n'analyse pas le (La) TeX, il mutilera horriblement les commentaires, les environnements textuels et d'autres syntaxes spéciales. Vous voudrez peut-être examiner DeTeX ou d'autres convertisseurs (La) TeX en texte.
la source
Solution Sed
Notez que dans cette solution
:a
créez une étiquette et n'utilisez pas laa
commande.Remplacement de plusieurs espaces
Utilisation
tr
:$ tr -s ' ' <test.text
la source
Si j'ai bien compris, une ligne vide implique deux sauts de ligne consécutifs,
\n\n
.Si c'est le cas, une solution possible serait d'éliminer toutes les occurrences singulières de nouvelles lignes.
En Perl, une affirmation d'anticipation est un moyen d'y parvenir:
-0777
drapeau déroule efficacement tout le fichier en une seule chaîne-p
indique à perl d'imprimer la chaîne sur laquelle il travaille par défaut-i
spécifie l'édition sur placela source
(raviver une ancienne question)
Cela semble être exactement ce que
fmt
etpar
sont pour - reformatage paragraphe. Comme vous (et aussi comme de nombreux programmes), ils définissent les limites des paragraphes comme une (ou plusieurs) lignes vides. Essayez de passer votre texte à travers l'un d'eux.fmt
est un utilitaire Unix standard et peut être trouvé dans GNU Coreutils.par
est unfmt
texte considérablement amélioré écrit par Adam M. Costello qui peut être trouvé à http://www.nicemice.net/par/ (il a également été empaqueté pour plusieurs distributions, y compris debian - je l'ai empaqueté pour debian en janvier 1996, bien qu'il y ait maintenant un nouveau mainteneur pour le paquet.).la source
sed
ajoutera n'importe quelle ligne à l'H
ancien espace qui contient au moins un seul caractère. Il supprime immédiatementd
tous ceux à l'exception peut-être du dernier. Les seules lignes qui peuvent rester sont des blancs, et c'est sur ces lignes quesed
ex
change les espaces de maintien et de motif et supprime tous les accumulés\n
caractères de ligne électronique .Si vous souhaitez que les lignes contenant uniquement <tabs> ou <spaces> soient considérées comme vides, remplacez l'
/./
adresse ci-dessus par/[^[:blank:]]/
. Pour compresser également les espaces, procédez comme suit:la source
Après avoir vu les exemples compacts de perl et awk de Gilles, j'étais réticent à poster ceci, mais j'avais déjà fait l'exercice, et c'est un script qui fonctionne, qui est raisonnablement documenté; ce point à lui seul peut intéresser certains .. (séduit avec commentaires! :)
Ce script considère les lignes vides comme vides même si elles contiennent des espaces.
Plusieurs espaces dans le texte sont condensés en un seul espace.
Les espaces de fin sont supprimés des lignes de texte. Les lignes vierges consécutives sont regroupées en une seule ligne. Le script laisse les lignes vierges supérieure et inférieure intactes.
Pour quoi que ce soit de plus que les scripts les plus triviaux, sed peut être écrit beaucoup plus facilement sous une forme structurée, en tant que fichier de script séparé. Voici un tel exemple.
en utilisant la syntaxe regex étendue
appel: $ sed -rf fichier texte du script
Remarque:
flush
dans les commentaires, cela signifie: envoyer l'espace de motif à la gestion interne de la sortie standard de sed. Cela ne signifie pas une impression définitive à stdout. La sortie dépend de l'-n
option de sed . par exemple. laq
commande signifie vider et quitter ... Comparez ces deux extraits:echo x |sed -e q
imprime x,echo x |sed -ne q
n'imprime rien, alors que l'utilisation de lap
commande afficherait 'x' deux ou une fois, selon l'-n
option.la source
Voici encore une autre
sed
solution qui concatène toutes les lignes dans lsed
'"espace d'attente" de sorte que nous obtenions une longue chaîne qui sera finalement copiée dans "l'espace du motif" pour la correspondance des motifs.Comme les sauts de ligne seront conservés dans la chaîne longue finale
sed
de l '"espace de motif", les lignes vides en termes de doubles sauts de ligne[^\n]\n\n[^\n]
peuvent être mises en correspondance et modifiées pour[^\n]\n[^\n]
.Pour plus d'informations, voir, par exemple, sed et Recherche et remplacement multiligne .
la source
Cela pourrait être de la vieille école:
Cela produira votre texte aligné à gauche (
.ad l
), avec une longueur de ligne de 80 (.ll 80
). L'option de longueur de page (.pl
) indique au processeur de texte d'effectuer un remplissage de page pour une longueur de page de 1, donc aucun remplissage de page.Si vous souhaitez que tous vos paragraphes sur une seule ligne, vous pouvez utiliser un grand nombre pour
.ll
:man 7 groff pour plus d'options de formatage.
la source
Dans Emacs, j'utilise parfois ceci
regex
:Veux dire:
la source
Il s'avère que avec
auto-fill-mode
on, emacs fait un très bon travail pour mes cas d'utilisation simples avec justeM-q
...la source
auto-fill-mode
qui dépend du mode principal que vous avez activé.