Réponse rapide
sed ':a;N;$!ba;s/\n/ /g' file
- : a créer une étiquette 'a'
- N ajoute la ligne suivante à l'espace de motif
- $! si ce n'est pas la dernière ligne , ba branche (allez à) étiquette 'a'
- s remplacer , / \ n / regex pour la nouvelle ligne , / / par un espace , / g correspondance globale (autant de fois que possible)
sed effectuera une boucle à travers les étapes 1 à 3 jusqu'à ce qu'il atteigne la dernière ligne, pour que toutes les lignes tiennent dans l'espace du modèle où sed remplacera tous les \ n caractères
Alternatives
Toutes les alternatives, contrairement à sed, n'auront pas besoin d'atteindre la dernière ligne pour commencer le processus
avec bash , lent
while read line; do printf "%s" "$line "; done < file
avec perl , vitesse semblable à sed
perl -p -e 's/\n/ /' file
avec tr , plus rapide que sed , peut remplacer par un seul caractère
tr '\n' ' ' < file
avec pâte , vitesse tr- like, peut remplacer par un seul caractère
paste -s -d ' ' file
avec vitesse awk , tr- like
awk 1 ORS=' ' file
Une autre alternative comme "echo $ (<fichier)" est lente, ne fonctionne que sur les petits fichiers et doit traiter le fichier entier pour commencer le processus.
5.10. Pourquoi ne puis-je pas faire correspondre ou supprimer une nouvelle ligne en utilisant la
séquence d' échappement \ n ? Pourquoi ne puis-je pas faire correspondre 2 lignes ou plus en utilisant \ n?
Le \ n ne correspondra jamais à la nouvelle ligne à la fin de la ligne car le
nouvelle ligne est toujours supprimée avant que la ligne ne soit placée dans l'
espace de motif. Pour obtenir 2 lignes ou plus dans l'espace de motif, utilisez
la commande 'N' ou quelque chose de similaire (comme 'H; ...; g;').
Sed fonctionne comme ceci: sed lit une ligne à la fois, coupe la
nouvelle ligne de fin, place ce qui reste dans l'espace de modèle où
le script sed peut l'adresser ou le modifier, et lorsque l'espace de modèle
est imprimé, ajoute une nouvelle ligne à stdout (ou vers un fichier). Si l'
espace de motif est entièrement ou partiellement supprimé avec 'd' ou 'D', la
nouvelle ligne n'est pas ajoutée dans de tels cas. Ainsi, des scripts comme
sed 's/\n//' file # to delete newlines from each line
sed 's/\n/foo\n/' file # to add a word to the end of each line
ne fonctionnera JAMAIS, car la nouvelle ligne de fin est supprimée avant que
la ligne ne soit placée dans l'espace de motif. Pour effectuer les tâches ci-dessus,
utilisez plutôt l'un de ces scripts:
tr -d '\n' < file # use tr to delete newlines
sed ':a;N;$!ba;s/\n//g' file # GNU sed to delete newlines
sed 's/$/ foo/' file # add "foo" to end of each line
Étant donné que les versions de sed autres que GNU sed ont des limites à la taille du
tampon de modèle, l'utilitaire «tr» d'Unix est préférable ici.
Si la dernière ligne du fichier contient une nouvelle ligne, GNU sed ajoutera
cette nouvelle ligne à la sortie mais supprimera toutes les autres, tandis que tr
supprimera toutes les nouvelles lignes.
Pour faire correspondre un bloc de deux lignes ou plus, il y a 3 choix de base:
(1) utilisez la commande «N» pour ajouter la ligne suivante à l'espace de motif;
(2) utilisez la commande «H» au moins deux fois pour ajouter la ligne actuelle
à l'espace d'attente, puis récupérez les lignes de l'espace d'attente
avec x, g ou G; ou (3) utiliser des plages d'adresses (voir section 3.3, ci-dessus)
pour faire correspondre les lignes entre deux adresses spécifiées.
Les choix (1) et (2) mettront un \ n dans l'espace modèle, où il
pourra être adressé comme souhaité ('s / ABC \ nXYZ / alphabet / g'). Un exemple
d'utilisation de «N» pour supprimer un bloc de lignes apparaît dans la section 4.13
(«Comment supprimer un bloc de lignes consécutives spécifiques ?»). Cet
exemple peut être modifié en remplaçant la commande delete par
autre chose , comme 'p' (impression), 'i' (insertion), 'c' (changement), 'a' (ajout),
ou 's' (remplacement) .
Choice (3) ne sera pas mettre \ n dans l'espace de travail , mais il ne
correspond un bloc de lignes consécutives, donc il se peut que vous n'avez pas
même besoin \ n pour trouver ce que vous cherchez. Depuis GNU sed
version 3.02.80 prend désormais en charge cette syntaxe:
sed '/start/,+4d' # to delete "start" plus the next 4 lines,
en plus des
adresses traditionnelles "/ d'ici /, / là-bas / {...}" , il peut être possible d'éviter complètement l'utilisation de \ n.
tr
n'est le bon outil pour le travail que si remplacer un seul caractère par un seul caractère, tandis que l'exemple ci-dessus montre remplacer la nouvelle ligne par un espace. Donc dans l'exemple ci-dessus, tr pourrait fonctionner .. Mais serait limitant plus tard.