[Fichier] Remplacement caractère 0D par 0D 0A

Fermé
Franck - 20 déc. 2006 à 23:38
 Aguinaldo - 17 déc. 2007 à 21:58
Bonsoir,

Je dois remplacer les séparateurs de champ 0D par du 0D 0A d'un fichier texte.

Je suis sur AIX en shell

Si qqun a une idée ou voir la solution cela serait top

Merci.

Franck

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
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.
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 895
3 sept. 2007 à 13:22
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
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
sed -i.orig 's/0D/0D 0A/g' fichier 
1
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
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'
1
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
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
1

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
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
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
678213
avec 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
1
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
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 :
sed "s/0D/0D 0A/g" fichier 

Bonne chance
0
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
Je me doutais qu'il me manquait une option !!! :-) Merci de la précision lami20j :p
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
21 déc. 2006 à 13:42
Avec plaisir :-)
0
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
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
0
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
ajout

peut-être du style sed 's//\\n/\\r//g'

Quand pensez-vous ?
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
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
perl -pi.orig -e 's/\x0D/\x0D\x0A/' fichier
Tu es sûr? Ce n'est pas plutôt 0A avec 0D 0A ?

ce qui donne
perl -pi.orig 's/\x0A/\x0D\x0A/' fichier

0
1rueSaintMartin
3 sept. 2007 à 15:11
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
0
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
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 :

#!/usr/bin/perl
[...]
 open (Fin, $fid);
  while ($t = <Fin>)
          $t =~ s/\r/\n/g ;
0
Il faut utiliser

unix2dos (file avec 0a seulement) (file with both 0d 0a)

A+
0