Remplacer un retour à la ligne par un espace

Fermé
sheol - 20 déc. 2007 à 22:02
 sheol - 21 déc. 2007 à 07:54
Bonjour,

Je cherche, avec sed ou un autre bin de base, à remplacer tous les retours à la ligne de mon fichier par un espace.
Je ne comprends pas pourquoi

cat fichier | sed 's/\\n/ /g' ne fonctionne pas

j'en ai essayé des cargaisons, passé un temps fou sur le man et les forums etc ou on décrit pour passer de retour chariot DOS vers UNIX et tout mais impossible de trouver la solution. Je dois etre trop nul.

Je précise que je travaille intégralement en environnement linux. Il n'y a pas d'histoires de conversion DOS. C'est "juste", sous linux, à transformer un retour chariot en un espace.

Si quelqu'un pouvait m'aider s'il vous plait...

5 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
20 déc. 2007 à 22:23
Salut,

Si tu tiens absolument à le faire avec "sed" :
sed -i.BAK ':z;N;s/\n/ /;bz' fichier
;-))
15
vignemail1 Messages postés 1246 Date d'inscription vendredi 8 octobre 2004 Statut Contributeur Dernière intervention 13 septembre 2019 259
20 déc. 2007 à 22:16
cat source.txt|tr "\n" " ">dest.txt
9
Bonsoir

Votre commande ne peut pas faire ce à quoi vous vous attendiez pourtant. La simple raison est que le caractère \n ne fait pas partie de la chaîne examinée par sed. Une solution serait, avec une boucle while, d'inclure toutes les lignes dans le "pattern buffer" (désolé de l'anglicisme), puis de supprimer ce fameux caractère \n. C'est envisageable pour un petit fichier... car tout el fichier doit tenir en mémoire. C'est donc pas une solution universelle.

Une solution qui marche, mais on peut certainement faire mieux :
awk 'BEGIN {ORS=" "} {print} END {print "\n"}' <fichier>

Explications :
Dans la section BEGIN, on définit le séparateur d'enregistrement en sortie (la variable ORS) à <espace>.
Dans la section principale, pour chaque ligne du fichier en entrée, il n'y a qu'une action : imprime
Dans la section END, pour faire propre, on imprime un retour à la ligne.

(-: un simple "man awk" vous aurait mis sur la piste de cette solution
En espérant que cela serve
Ciao
2
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
20 déc. 2007 à 22:57
Salut,

Votre commande ne peut pas faire ce à quoi vous vous attendiez pourtant. La simple raison est que le caractère \n ne fait pas partie de la chaîne examinée par sed.

Si si ça le fait ;-)


Une solution serait, avec une boucle while, d'inclure toutes les lignes dans le "pattern buffer" (désolé de l'anglicisme), puis de supprimer ce fameux caractère \n.

C'est exactement ce que fait la commande au-dessus ;-)


C'est envisageable pour un petit fichier... car tout el fichier doit tenir en mémoire. C'est donc pas une solution universelle.

Avec GNU sed il n'y a pas de limite au niveau des tampons ;-)
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
20 déc. 2007 à 22:06
Salut,
lami20j@debian:~/trash2/vider$ cat a
ligne1
ligne2
ligne3
lami20j@debian:~/trash2/vider$ perl -pi.orig -e 's/\n/ /' a
lami20j@debian:~/trash2/vider$ cat a
ligne1 ligne2 ligne3 lami20j@debian:~/trash2/vider$

1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bonjour !

Merci beaucoup pour toutes vos réponses !!! Je vais toutes les étudier en détail.
La solution tr est la plus simple et c'est celle que je vais utiliser dans l'immédiat.

Par contre j'avais en effet imaginé que awk pourrait faire un travail du genre sur mes fichiers mais ... awk ça me fait un peu peur :P donc je m'imaginais la solution très compliquée (à raison ? :) )

J'ouvre un autre topic qui fait suite à celui-ci et surtout à vos réponses.

En tous cas merci !!! :-))

Maximilien.
1