#1 Le 08/02/2007, à 17: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, à 14:24)
Hors ligne
#2 Le 09/02/2007, à 23:26
- luron
Re : [Résolu] Remplacer des chaînes de caractères dans des fichiers
Une idée?
Hors ligne
#3 Le 10/02/2007, à 02: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, à 03: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, à 15:51
- luron
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.htmlil 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...
Hors ligne
#6 Le 10/02/2007, à 15: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, à 16:17
- luron
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
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, à 16: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, à 16:49
- luron
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.
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, à 20: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
#11 Le 10/02/2007, à 20:20
- luron
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 ?
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, à 01:37
- luron
Re : [Résolu] Remplacer des chaînes de caractères dans des fichiers
Bon, j'ai trouvé 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, à 02: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, à 10: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