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 08/02/2007, à 18:51

luron

[Résolu] Remplacer des chaînes de caractères dans des fichiers

Bonjour,

J'ai plusieurs fichiers dans lesquels je dois remplacer des chaînes de caractères. J'aimerais donc automatiser le tout. J'ai fait des recherches pour pouvoir écrire un petit script. Pour des cas simples, je réussis avec ceci:

sed -e "s/mot1/mot2/g" fichier_original > fichier_final

Mais pour des cas plus complexes, je n'y arrive pas. Par exemple:

bla bla bla<br />
<a href="Nombre.jpg">Nombre</a>bla bla bla

J'amerais remplacer tout ce qui est entre les bla bla bla, donc ceci:

<br />
<a href="Nombre.jpg">Nombre</a>

Pour les nombres, je peux utiliser [0-9][0-9]*. Je dois aussi mettre des \ avant certains caractères. Je crois que le retour à la ligne entre <br /> et <a peut être représenté par un point, selon ce que j'ai lu sur Internet: «Comme sed, awk  et grep travaillent ligne par ligne, il n'y aura habituellement pas de retour à la ligne à chercher. Dans les cas où il existerait un retour à la ligne dans une expression à plusieurs lignes, le point correspondra au retour à la ligne.»

Voici donc ce que j'ai essayé:

sed -e "s/<br \/>.<a href="[0-9][0-9]*\.jpg">[0-9][0-9]*<\/a>/mot/g" fichier_original > fichier_final

Mais ça ne fonctionne pas. Comme vous voyez, j'ai plusieurs éléments que je n'arrive pas à associer correctement. Si quelqu'un a une idée... Merci beaucoup!

Dernière modification par luron (Le 11/02/2007, à 15:24)

Hors ligne

#2 Le 10/02/2007, à 00:26

luron

Re : [Résolu] Remplacer des chaînes de caractères dans des fichiers

Une idée? smile

Hors ligne

#3 Le 10/02/2007, à 03:46

luron

Re : [Résolu] Remplacer des chaînes de caractères dans des fichiers

Bon, j'ai fait des tests et je peux maintenant trouver une partie de ce que je cherche, par exemple:

sed -i -e 's|<a href="[0-9][0-9]*\.jpg">[0-9][0-9]*</a>|remplacement|g' fichier

Je n'ai pas résolu toutefois mon problème de retour à la ligne. J'arrive à insérer un retour à la ligne en mettant un vrai retour à la ligne dans le code, par exemple comme ceci:

sed -i -e 's|expression|remplacement\
suiteremplacement|g' fichier

Je n'arrive pas cependant à chercher une chaîne qui contient un retour à la ligne, comme ceci:

sed -i -e 's|expression\
suiteexpression|remplacement|g' fichier

Ça ne fonctionne pas. Quelqu'un a une idée? Merci!

Hors ligne

#4 Le 10/02/2007, à 04:36

Enjoy Aspirin

Re : [Résolu] Remplacer des chaînes de caractères dans des fichiers

en utilisant le code ASCII peut-être ? J'ai pas essayé hein
http://www.december.com/html/spec/ascii.html

il faut écrire le code hexa prédédé de \x
dans ton cas :
\x0A

#5 Le 10/02/2007, à 16:51

luron

Re : [Résolu] Remplacer des chaînes de caractères dans des fichiers

Enjoy Aspirin a écrit :

en utilisant le code ASCII peut-être ? J'ai pas essayé hein
http://www.december.com/html/spec/ascii.html

il faut écrire le code hexa prédédé de \x
dans ton cas :
\x0A

Merci pour ta suggestion, mais encore une fois, ça fonctionne lorsque le retour à la ligne se trouve dans l'expression de remplacement, mais pas dans la chaîne à trouver... sad

Hors ligne

#6 Le 10/02/2007, à 16:55

PDemong

Re : [Résolu] Remplacer des chaînes de caractères dans des fichiers

Pour mettre un retour chariot dans ta ligne de commande, faut la protéger. Le truc, tu fais Ctrl+V puis tu tapes ton retour chariot. Ca devrait te l'afficher comme cela :
^M

Hors ligne

#7 Le 10/02/2007, à 17:17

luron

Re : [Résolu] Remplacer des chaînes de caractères dans des fichiers

PDemong a écrit :

Pour mettre un retour chariot dans ta ligne de commande, faut la protéger. Le truc, tu fais Ctrl+V puis tu tapes ton retour chariot. Ca devrait te l'afficher comme cela :
^M

Merci PDemong, mais le problème ne vient pas de là, car ça fonctionne quand le retour à la ligne se trouve dans l'expression de remplacement et aussi car je mets mon code dans un fichier que j'exécute par la suite dans une console.

Hors ligne

#8 Le 10/02/2007, à 17:30

PDemong

Re : [Résolu] Remplacer des chaînes de caractères dans des fichiers

J'ai un peu de mal à voir ce que tu veux faire. Je me doute que tu veux récupérer en automatique des affaires dans le résultat d'un wget, mais peut-être pourrais-tu donner un extrait du source, et le résultat que tu espères...

En attendant, voici une piste, si j'ai bien suivi ton problème.
Tu as dans un fichier toto ca :

bla bla bla<br />
<a href="Nombre.jpg">Nombre</a>bla bla bla

et tu veux ca :

bla bla bla<br /><a href="Nombre.jpg">Nombre</a>bla bla bla

Je pars du principe que le mot clé est Nombre. Tu pourrais faire :

LINE1=$(grep -B1 Nombre toto | head -n1)
LINE2=$(grep Nombre)
echo ${LINE1}${LINE2}

Hors ligne

#9 Le 10/02/2007, à 17:49

luron

Re : [Résolu] Remplacer des chaînes de caractères dans des fichiers

PDemong a écrit :

J'ai un peu de mal à voir ce que tu veux faire.

En fait, tout ce que je veux faire, c'est trouver une façon de rechercher une chaîne de caractères contenant un retour à la ligne pour rempacer cette chaîne par une autre. Disons que j'ai un fichier contenant ceci:

mot1 mot2 mot3
mot4 mot5 mot6
mot7 mot8 mot9
...

Je peux remplacer mot1 par remplacement1 avec ceci:

sed -i -e 's|mot1|remplacement1|g' fichier

Le fichier devient donc ceci:

remplacement1 mot2 mot3
mot4 mot5 mot6
mot7 mot8 mot9
...

Cependant, je n'arrive pas à rechercher l'expression suivante:

mot3
mot4

car il y a un retour à la ligne dans l'expression à rechercher.

Hors ligne

#10 Le 10/02/2007, à 21:07

Enjoy Aspirin

Re : [Résolu] Remplacer des chaînes de caractères dans des fichiers

en fait tu veux remplacer mot1 par remplacement1 à condition d'avoir mot3 à la fin de la même ligne et mot4 à la ligne suivante ?

et bien j'aimerais bien connaitre la solution lol

#11 Le 10/02/2007, à 21:20

luron

Re : [Résolu] Remplacer des chaînes de caractères dans des fichiers

Enjoy Aspirin a écrit :

en fait tu veux remplacer mot1 par remplacement1 à condition d'avoir mot3 à la fin de la même ligne et mot4 à la ligne suivante ?

Non, l'exemple de remplacer mot1 par remplacement1 était seulement pour montrer que jétais capable de remplacer du texte lorsque le texte en question ne contenait pas de retour à la ligne.

En somme, tout ce que je veux faire, c'est chercher une portion de texte contenant un retour à la ligne pour remplacer cette portion de texte par quelque chose d'autre, par exemple chercher dans le texte suivant ce qui est en gras:

bla bla bla bla bla
bla bla bla bla bla mot3
mot4
bla bla bla bla bla
bla bla bla bla bla

Hors ligne

#12 Le 11/02/2007, à 02:37

luron

Re : [Résolu] Remplacer des chaînes de caractères dans des fichiers

Bon, j'ai trouvé cool grâce à ce sujet. Pour les personnes intéressées, voici ce que j'ai fait:

sed -i -f fichier_script fichier_a_modifier

Le contenu du fichier script est:

:join
/mot3$/{N
s/mot3\nmot4/remplacement2/
b join
}

Hors ligne

#13 Le 11/02/2007, à 03:37

PDemong

Re : [Résolu] Remplacer des chaînes de caractères dans des fichiers

ok, donc tu devrais appliquer ma proposition précédente. Les commande awk ou sed ont une portée ligne à ligne, et ne peuvent répondre à ton besoin tant que tu ne mets pas ton expression sur une seule et même ligne.

Je comprends ton approche, mais tu dois prendre le problème à l'envers : former une ligne où tu sauras y substituer ton expression. Sauf si quelqu'un peut te trouver une façon d'identifier une expression sur plusieurs lignes... mais sans écrire un programme en C, je ne vois pas comment faire cela avec les outils unix.

Bonne chance.

Hors ligne

#14 Le 11/02/2007, à 11:16

Enjoy Aspirin

Re : [Résolu] Remplacer des chaînes de caractères dans des fichiers

Bravo!
Je suis largué par la syntaxe du script sinon lol