13 réponses
1rueSaintMartin
Messages postés
3
Date d'inscription
vendredi 13 juillet 2007
Statut
Membre
Dernière intervention
3 septembre 2007
2
3 sept. 2007 à 12:57
3 sept. 2007 à 12:57
Bonjour,
Je relance cette discussion car je ne trouve pas de solution à mon problème :
J'ai un fichier texte qui contient plusieurs lignes de la forme : nombre <tab> nombre <tab> string \r
mon problème est de remplacer ces \r par des \n.
J'ai essayer les deux commandes ci-dessus :
-> perl -pi.orig -e 's/\x0D/\x0D\x0A/' fichier
me donne :
-> Substitution replacement not terminated at -e line 1.
????
Quant à :
-> sed -i.orig 's/0D/0D 0A/g' fichier
la commande s'execute bien, mais lorsque j'ouvre le fichier résultant avec un éditeur hexadécimal, pas de trace du \n : le 0D est toujours tout seul...
Quelqu'un aurait-il une idée?
Par avance merci.
Je relance cette discussion car je ne trouve pas de solution à mon problème :
J'ai un fichier texte qui contient plusieurs lignes de la forme : nombre <tab> nombre <tab> string \r
mon problème est de remplacer ces \r par des \n.
J'ai essayer les deux commandes ci-dessus :
-> perl -pi.orig -e 's/\x0D/\x0D\x0A/' fichier
me donne :
-> Substitution replacement not terminated at -e line 1.
????
Quant à :
-> sed -i.orig 's/0D/0D 0A/g' fichier
la commande s'execute bien, mais lorsque j'ouvre le fichier résultant avec un éditeur hexadécimal, pas de trace du \n : le 0D est toujours tout seul...
Quelqu'un aurait-il une idée?
Par avance merci.
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
21 déc. 2006 à 06:59
21 déc. 2006 à 06:59
Salut,
il faut utiliser l'option -i.orig pour l'édition sur place et la sauvagarde de fichier dans le même temps
On modifie le fichier sur place et on le sauvegarde avec le nom fichier.orig
il faut utiliser l'option -i.orig pour l'édition sur place et la sauvagarde de fichier dans le même temps
On modifie le fichier sur place et on le sauvegarde avec le nom fichier.orig
sed -i.orig 's/0D/0D 0A/g' fichier
dubcek
Messages postés
18718
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
22 mars 2024
5 615
3 sept. 2007 à 13:58
3 sept. 2007 à 13:58
hello
voir aussi
unix2dos - convert text file from ISO format to DOS format
dos2unix - convert text file from DOS format to ISO format
tr - translate characters : tr '\r' '\n'
voir aussi
unix2dos - convert text file from ISO format to DOS format
dos2unix - convert text file from DOS format to ISO format
tr - translate characters : tr '\r' '\n'
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
3 sept. 2007 à 15:23
3 sept. 2007 à 15:23
Salut,
Ce qui fait que mon problème ne correspond pas aux solutions proposée plus haut sauf la solution : tr '\r' '\n' qui fonctionne.
C'est normal puisque ce n'est pas la même situation
Dans le message initial est demandé
Je dois remplacer les séparateurs de champ 0D par du 0D 0A d'un fichier texte.
En bref remplacer \r avec \r\n tandis que ta situation était de remplacer \r avec \n
Ce qui fait que mon problème ne correspond pas aux solutions proposée plus haut sauf la solution : tr '\r' '\n' qui fonctionne.
C'est normal puisque ce n'est pas la même situation
Dans le message initial est demandé
Je dois remplacer les séparateurs de champ 0D par du 0D 0A d'un fichier texte.
En bref remplacer \r avec \r\n tandis que ta situation était de remplacer \r avec \n
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
3 sept. 2007 à 19:22
3 sept. 2007 à 19:22
Salut,
il faut connaître la structure de ton fichier pour pouvoir te donner une réponse
voici un exemple
CR - CarriageReturn - code ASCII 13
LF - LineFeed - code ASCII 10
le modificateur /g on l'utilise si on veut faire un remplacement global et je ne pense pas que c'est le cas vu que c'est seulement la fin de la chaine qui nous intéresse
dans mon exemple on voit bien que
la 1ère ligne se finie avec \r\n
la 2ème avec \n
la 3ème avec \r
comme ça je sais ce que je dois traiter
il faut connaître la structure de ton fichier pour pouvoir te donner une réponse
voici un exemple
CR - CarriageReturn - code ASCII 13
LF - LineFeed - code ASCII 10
lami20j@deb:~/trash$ cat -t aaa && echo CRLF^M LF CR^M lami20j@deb:~/trash$ perl -ne 's/(.)/ord($1)/egs and print "$_\n"' aaa 678276701310 767010 678213avec cette commande on peut voir ce que ton fichier contient exactement en fin de chaine
le modificateur /g on l'utilise si on veut faire un remplacement global et je ne pense pas que c'est le cas vu que c'est seulement la fin de la chaine qui nous intéresse
dans mon exemple on voit bien que
la 1ère ligne se finie avec \r\n
la 2ème avec \n
la 3ème avec \r
comme ça je sais ce que je dois traiter
mamiemando
Messages postés
33079
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
23 avril 2024
7 749
21 déc. 2006 à 02:06
21 déc. 2006 à 02:06
Ca se fait en sed ou avec vim.
http://www.tuxcoffee.net/articles/2006/11/23/sed/
Au préalable backupe ton fichier au cas où je me craque mais a priori :
Bonne chance
http://www.tuxcoffee.net/articles/2006/11/23/sed/
Au préalable backupe ton fichier au cas où je me craque mais a priori :
sed "s/0D/0D 0A/g" fichier
Bonne chance
mamiemando
Messages postés
33079
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
23 avril 2024
7 749
21 déc. 2006 à 13:36
21 déc. 2006 à 13:36
Je me doutais qu'il me manquait une option !!! :-) Merci de la précision lami20j :p
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
21 déc. 2006 à 13:42
21 déc. 2006 à 13:42
Avec plaisir :-)
Franck77
Messages postés
2
Date d'inscription
vendredi 27 août 2004
Statut
Membre
Dernière intervention
21 décembre 2006
21 déc. 2006 à 20:03
21 déc. 2006 à 20:03
Merci pour vos réponses
J'ai bien essayé avec sed mais le problème est qu'il traite les données en ASCII et non pas en Hexa.
Voilà mon problème !
Comment faire travailler sed en mode hexa ???
j'avais pensé à iconv ou alors une commande de type unix2dos mais je suis sur AIX
Merci
J'ai bien essayé avec sed mais le problème est qu'il traite les données en ASCII et non pas en Hexa.
Voilà mon problème !
Comment faire travailler sed en mode hexa ???
j'avais pensé à iconv ou alors une commande de type unix2dos mais je suis sur AIX
Merci
Franck77
Messages postés
2
Date d'inscription
vendredi 27 août 2004
Statut
Membre
Dernière intervention
21 décembre 2006
21 déc. 2006 à 20:05
21 déc. 2006 à 20:05
ajout
peut-être du style sed 's//\\n/\\r//g'
Quand pensez-vous ?
peut-être du style sed 's//\\n/\\r//g'
Quand pensez-vous ?
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
21 déc. 2006 à 20:50
21 déc. 2006 à 20:50
Salut,
0A corresponde à LF ( 10 ASCII) donc \n
0D corresponde à CR ( 13 ASCII) donc \r
voilà une solution avec Perl
ce qui donne
0A corresponde à LF ( 10 ASCII) donc \n
0D corresponde à CR ( 13 ASCII) donc \r
voilà une solution avec Perl
perl -pi.orig -e 's/\x0D/\x0D\x0A/' fichierTu es sûr? Ce n'est pas plutôt 0A avec 0D 0A ?
ce qui donne
perl -pi.orig 's/\x0A/\x0D\x0A/' fichier
Bon j'ai enfin trouvé ce que je cherchais, et vive le partage des connaissances.
Je précise juste que mon problème venait des fichiers de marker généré par Audacity. Ces fichiers ne contiennent qu'un \r à la fin de chaque ligne. Je n'arrivais donc pas bien à les parser avec mon script perl.
Ce qui fait que mon problème ne correspond pas aux solutions proposée plus haut sauf la solution : tr '\r' '\n' qui fonctionne.
En complément, voici un lien vers une page avec toutes les commandes (bash, perl, ...) qui permettent de résoudre le problème des ^M en trop :
http://www.lea-linux.org/cached/index/Trucs:Supprimer_les_%5EM_dans_les_fichiers_ASCII.html
Je précise juste que mon problème venait des fichiers de marker généré par Audacity. Ces fichiers ne contiennent qu'un \r à la fin de chaque ligne. Je n'arrivais donc pas bien à les parser avec mon script perl.
Ce qui fait que mon problème ne correspond pas aux solutions proposée plus haut sauf la solution : tr '\r' '\n' qui fonctionne.
En complément, voici un lien vers une page avec toutes les commandes (bash, perl, ...) qui permettent de résoudre le problème des ^M en trop :
http://www.lea-linux.org/cached/index/Trucs:Supprimer_les_%5EM_dans_les_fichiers_ASCII.html
1rueSaintMartin
Messages postés
3
Date d'inscription
vendredi 13 juillet 2007
Statut
Membre
Dernière intervention
3 septembre 2007
2
3 sept. 2007 à 17:51
3 sept. 2007 à 17:51
Et en fait la solution ne correspond pas vraiment et je fais appel aux experts de perl :
quelle est la syntaxe qui me permettrait de remplacer à la " s/'\r'/'\n'/g " les caractères génant directement dans mon code perl?
En effet mon problème est que je n'arrive pas à trouver la syntaxe qui va bien puisque tous les exemples perl de remplacement de caratères dans un fichier partent du principe que le fichier est bien fait et que l'on peut itérer sur les lignes....
Ce qui fait que dans mon cas, le code ci-dessous ne marche pas :
quelle est la syntaxe qui me permettrait de remplacer à la " s/'\r'/'\n'/g " les caractères génant directement dans mon code perl?
En effet mon problème est que je n'arrive pas à trouver la syntaxe qui va bien puisque tous les exemples perl de remplacement de caratères dans un fichier partent du principe que le fichier est bien fait et que l'on peut itérer sur les lignes....
Ce qui fait que dans mon cas, le code ci-dessous ne marche pas :
#!/usr/bin/perl [...] open (Fin, $fid); while ($t = <Fin>) $t =~ s/\r/\n/g ;
3 sept. 2007 à 13:22
sed conversion retours chariots dos crlf unix lf#conversion dos vers unix
;-))