Remplacer toutes les nouvelles lignes dans l'espace sauf la dernière

38

Comment puis-je remplacer toutes les nouvelles lignes par un espace, à l'exception de la dernière nouvelle ligne? Je peux remplacer toutes les nouvelles lignes dans l'espace, trmais comment puis-je le faire à quelques exceptions près?

Gilles, arrête de faire le mal
la source

Réponses:

42

Vous pouvez utiliser paste -s -d ' ' file.txt:

$ cat file.txt
one line
another line
third line
fourth line

$ paste -s -d ' ' file.txt 
one line another line third line fourth line
Grebneke
la source
1
Cool! Les options -set -dsemblent être faites pour ce cas.
mkc
10

Vous pouvez utiliser trpour remplacer toutes les nouvelles lignes dans l'espace et transmettre la sortie à sedet remplacer le dernier espace par une nouvelle ligne:

tr '\n' ' ' < afile.txt | sed '$s/ $/\n/'
mkc
la source
5

Ré-implémenter l'idée de vonbrand en Perl, à condition que le fichier soit assez petit:

perl -p00e 's/\n(?!\Z)/ /g' your_file
Joseph R.
la source
+1 parce que cette méthode fonctionne pour les remplacements avec des caractères multi-octets (par opposition à coller avec GNU)
myrdd
-1

Quelque chose comme sed -e 's;\n\(.\); \1;'devrait faire ...

vonbrand
la source
-1

Cela a fonctionné pour moi.

tr '\n' ' ' < file_with_new_line   | sed 's/\ $//g' > file_with_space
Abhijit
la source
Cela supprimera également la dernière nouvelle ligne.
terdon
Je ne pense pas, cela fonctionne bien. Avez-vous vraiment essayé ???
Abhijit
Oui j'ai. Avez-vous? Votre trcommande remplace toutes les nouvelles lignes par des espaces et votre sedcommande supprime le dernier espace. Cela aboutit à un fichier sans fin de ligne finale et n’est donc pas ce que la question demande. À propos, il n'y a aucun intérêt à utiliser int gdans la sedcommande. Depuis que vous utilisez $, il ne peut correspondre que à la fin, le gest inutile. Vous n'avez pas non plus besoin d'échapper à l'espace, le `` ne fait pas de différence non plus.
terdon