Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 11/11/2018, à 20:00

Compte supprimé

[Résolu] Script pour remplacer un retour à la ligne.

Bonsoir,

Pour rendre plus présentable un fichier fabriqué par d'autres, je voudrais écrire un script de modification.
Il s'agit de remplacer des retours à la ligne par un caractère quelconque, un ! par exemple.

J'ai cru comprendre que l'on peut faire cela avec sed ou tr.
Mais toutes mes tentatives restent sans effet.

Le retour à la ligne me semble être reconnu avec l'expression \n, laquelle doit être "échappée"  dans la commande.
C'est ici que je fais appel à ceux qui savent pour me corriger. Merci d'avance.

tr '\\n' '!' < /mon.fichier.csv

ou
sed  "s/\n/!/g" /mon.fichier

Dernière modification par Compte supprimé (Le 12/11/2018, à 09:35)

#2 Le 11/11/2018, à 20:23

pingouinux

Re : [Résolu] Script pour remplacer un retour à la ligne.

Bonsoir,
Par exemple :

sed -n '1{h;b};H;${g;s/\n/!/gp}' fichier.csv

Hors ligne

#3 Le 11/11/2018, à 20:32

Compte supprimé

Re : [Résolu] Script pour remplacer un retour à la ligne.

Merci pingouinux,
D'autre part, si je veux obtenir un nouveau fichier avec ce résultat modifié, que faut-il préciser dans la commande ?

#4 Le 11/11/2018, à 20:46

pingouinux

Re : [Résolu] Script pour remplacer un retour à la ligne.

D'autre part, si je veux obtenir un nouveau fichier avec ce résultat modifié, que faut-il préciser dans la commande ?

sed -n '1{h;b};H;${g;s/\n/!/gp}' fichier.csv >nouveau_fichier

Hors ligne

#5 Le 11/11/2018, à 20:55

Watael

Re : [Résolu] Script pour remplacer un retour à la ligne.

salut,

tr $'\n' '!' < fichier >nouvOfichier

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#6 Le 11/11/2018, à 20:58

Compte supprimé

Re : [Résolu] Script pour remplacer un retour à la ligne.

Merci pour tout et bonsoir. Je vais regarder tout cela, mais il me semble que le retour à la ligne n'est pas supprimé.
C'est peut-être un \r ou t. Je testerai.

Edit,: Merci aussi Watael, là les retours sont bien remplacés par des !. Mais je n'ai pas encore tout sur la même ligne. Il me faut trouver le caratère à remplacer.

Dernière modification par Compte supprimé (Le 11/11/2018, à 21:02)

#7 Le 12/11/2018, à 08:33

pingouinux

Re : [Résolu] Script pour remplacer un retour à la ligne.

Si ça ne marche pas, donne le retour de

file fichier.csv
hd -n 200 fichier.csv

Hors ligne

#8 Le 12/11/2018, à 09:18

Compte supprimé

Re : [Résolu] Script pour remplacer un retour à la ligne.

@pingouinux
Ta question m'a permis de constater que ce fichier est  :

ISO-8859 text, with CRLF line terminators

Au passage, est-il possible d'en savoir un peu plus ? En effet le logiciel dans lequel j'importe ce fichier me demande si c'est du ISO-8859-1 ou du ISO-8859-15.

J'ai cru comprendre que CRLF est en fait un CR plus un LF et qu'ils correspondent à \12 et \15.
https://www.linuxquestions.org/question … ut-744114/
Si j'enlève les deux, je n'ai plus qu'une seule ligne pour tout le fichier. Et si je n'enlève que l'un ou l'autre, j'ai toujours les retours à la ligne.

Mais je vais en rester là car le logiciel qui importe ne fait pas les retours à la ligne intempestifs !!! Il affiche deux caractères spéciaux en forme de carré. Ça va rester comme cela.

hexdump -n 200 /mon_fichier
0000000 6144 6574 543b 6569 7372 443b 62e9 7469
0000010 433b e972 6964 3b74 0a0d 3930 312f 2f31
0000020 3032 3831 223b 6143 7372 7461 4c20 6e61
0000030 7567 6465 636f 5220 756f 7373 6c69 6f6c
0000040 206e 7250 3020 0d20 560a 7269 6d65 6e65
0000050 2074 6e45 5620 746f 6572 4620 7661 7565
0000060 2072 0a0d 6f56 7274 2065 6552 7274 6961
0000070 6574 5320 6365 7275 7469 2065 6f53 6963
0000080 6c61 2065 0a0d 3130 3039 3533 3636 2020
0000090 2020 2020 6554 7369 6573 7264 2065 2020
00000a0 3120 3130 2038 0a0d 3b22 313b 3134 372c
00000b0 3b36 0a0d 3930 312f 2f31 3032 3831 223b
00000c0 6956 6572 656d 746e                    
00000c8

Dernière modification par Compte supprimé (Le 12/11/2018, à 09:33)

#9 Le 12/11/2018, à 09:39

pingouinux

Re : [Résolu] Script pour remplacer un retour à la ligne.

En adaptant la commande de Watael en #5

tr -d $'\r' <fichier.csv | tr $'\n' '!' >nouveau_fichier

ou la mienne en #4

sed -n '1{h;b};H;${g;s/\r\n/!/gp}' fichier.csv >nouveau_fichier

La première ajoute aussi un ! après la dernière ligne, pas la seconde.

Hors ligne

#10 Le 12/11/2018, à 10:03

Compte supprimé

Re : [Résolu] Script pour remplacer un retour à la ligne.

J'ai essayé, mais dans les deux cas cela place tout en une seule ligne. Mon problème est certainement mal posé.
Vu que ce n'est plus que du cosmétique, je n'insiste pas. J'y reviendrai peut-être plus tard.

Pour le moment je vais chercher comment enlever les n premières lignes du fichier.

sed '1,9d'

devrait y parvenir.

Dernière modification par Compte supprimé (Le 12/11/2018, à 10:22)

#11 Le 12/11/2018, à 10:27

pingouinux

Re : [Résolu] Script pour remplacer un retour à la ligne.

Tamarou #1 a écrit :

Il s'agit de remplacer des retours à la ligne par un caractère quelconque, un ! par exemple.

Tamarou #10 a écrit :

J'ai essayé, mais dans les deux cas cela place tout en une seule ligne. Mon problème est certainement mal posé.

Si tu remplaces les retours à la ligne par autre chose, il est normal qu'il ne te reste plus qu'une seule ligne.

Hors ligne

#12 Le 12/11/2018, à 10:38

Compte supprimé

Re : [Résolu] Script pour remplacer un retour à la ligne.

Oui, bien sûr smile
En fait il faudrait supprimer les retours compris entre deux ";" qui délimitent un champ, mais pas ceux qui sont juste après un ";" de fin du dernier champ d'une ligne. tongue
Ça tourne un peu à l'usine à gaz. J'avais espoir que ce ne soit pas le même caractère dans les deux cas ...

Bon, maintenant les 10 premières lignes du fichier sont supprimées. Il me reste à renommer les titres des champs pour qu'ils soient reconnus par le logiciel.

Dernière modification par Compte supprimé (Le 12/11/2018, à 10:43)