Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
Remplacement d'une chaine dans plusieurs fichiers
Envoyé par: Fabrice Ledoux

Bonjour, je cherche à remplacer la chaine "Avant" par "Après" dans tous les fichiers .txt situés dans un répertoire donné. Je voudrais que ça me garde la bonne casse et que ça ne me remplace pas les "avant" ni que ça me remplace les "Avant" par "après".

sed "s/"Avant/Après/" *.txt

ne marche pas apparement. J'avoue ne pas être très doué pour jouer avec la ligne de commande !

Merci.

Poste le Thursday 10 March 2005 10:55:00
Répondre     Citer    
Re: Remplacement d'une chaine dans plusieurs fichiers
Envoyé par: tchoyy

Bah si, j'ai essayé cela fonctionne :

sed "s/avant/apres/" *.txt

Mais bien sur ça t'affiche sur la ligne de commande

Poste le Thursday 10 March 2005 11:09:08
Répondre     Citer    
Re: Remplacement d'une chaine dans plusieurs fichiers
Envoyé par: tchoyy

C'est barbare mais j'ai ça à te proposer :

A partir du shell (ou tu peux mettre ça dans un script) :

for fichier in `ls *.txt` ; do sed "s/avant/apres/" $fichier > tempfile ; mv tempfile $fichier ; done

Poste le Thursday 10 March 2005 11:21:47
Répondre     Citer    
Re: Remplacement d'une chaine dans plusieurs fichiers
Envoyé par: dby

donc faut renvoyer le resultat vers un fichier

sed "s/avant/apres/" fichier.txt > nouveau.txt

Poste le Thursday 10 March 2005 11:22:36
Répondre     Citer    
Re: Remplacement d'une chaine dans plusieurs fichiers
Envoyé par: Fabrice Ledoux

for fichier in `ls *.txt` ; do sed "s/Avant/Apres/" $fichier > tempfile ; mv tempfile $fichier ; done

fonctionne mais bizarrement, certains ne sont pas pris en compte. Par exemple, s'il y a "qqchoseAprès", le "Après" n'est pas modifié.

Poste le Thursday 10 March 2005 11:35:35
Répondre     Citer    
Re: Remplacement d'une chaine dans plusieurs fichiers
Envoyé par: tchoyy

Oula je suis perdu avec tes avant et après, j'ai pas compris la suite.

Mais si tu as plusieurs avant que tu veux passer en après sur une meme ligne il faut que tu rajoute g à sed => sed "s/avant/apres/g" sinon il va seulement prendre la première occurence

Poste le Thursday 10 March 2005 11:43:59
Répondre     Citer    
Re: Remplacement d'une chaine dans plusieurs fichiers
Envoyé par: Fabrice Ledoux

C'est parfait ! Ca marche avec le "/g" en plus ! Merci beaucoup pour toutes vos réponses vous m'avez fait gagner beaucoup de temps ! Parce qu'ouvrir chaque fichier pour remplacer toutes ces chaines, j'y aurais passé pas mal de temps ! Encore merci !

Poste le Thursday 10 March 2005 11:49:45
Répondre     Citer    
Re: Remplacement d'une chaine dans plusieurs fichiers
Envoyé par: tchoyy

Il y a toujours une solution avec notre linux adoré winking smiley

Poste le Thursday 10 March 2005 11:52:12
Répondre     Citer    
Re: Remplacement d'une chaine dans plusieurs fichiers
Envoyé par: Raph__

Salut,
sed "s/Avant/Apres/" marchera que si "avant" commence par une majuscule.

Un truc comme ca me semble plus aproprié :
sed -e "s/\\(A\|a\)\pres/\1vant/g"

A Ciao smiling smiley

Poste le Thursday 10 March 2005 13:10:54
Répondre     Citer    
Re: Remplacement d'une chaine dans plusieurs fichiers
Envoyé par: MDW

Citation
Raph__
Salut,
sed "s/Avant/Apres/" marchera que si "avant"
commence par une majuscule.

Un truc comme ca me semble plus aproprié :
sed -e "s/\\(A\|a\)\pres/\1vant/g"

A Ciao smiling smiley

Avec "s/avant/apres/ig" ca marche meme si on trouve aVant par example.


Par contre, je prefere le perl, toujours plus puissant:

perl -p -i -e 's/\bavant\b/apres/ig ;' <fichier>

Comme cela, uniquement les mots entiers seront remplacés (\b= limitation de mot). Si un des fichiers contient 'savant' par example, ont ne retrouve pas sapres.
En plus, pas besoin de copier le fichier, l'option '-i' le remplace dans le même fichier.
Attention l'utilisation des ' est important pour ne pas perdre l'antislash. Sinon il faut ecrire:

perl -p -i -e "s/\\bavant\\b/apres/ig ;" <fichier>

MDW

Poste le Thursday 10 March 2005 22:35:04
Répondre     Citer    
Re: Remplacement d'une chaine dans plusieurs fichiers
Envoyé par: Raph__

Salut,
sed -e "s/\\(A\|a\)\pres/\1vant/g" et non
sed -e "s/\(A|a)pres/1vant/g"

Cette commande permet de conserver la casse.
"apres" devient "avant" et "Apres" devient "Avant".

Par contre, sed "s/avant/apres/ig" ne tiendra pas compte de la casse, pas plus que :
perl -p -i -e 's/\bavant\b/apres/ig;'<fichier>. Tous les "apres, Apres" seront transformé en "avant".

Le problème, c'est le "savant", je n'y avais pas pensé.
En reprenant ta solution ca donnerait :
sed -e "s/\b\\(A\|a\)\vant\b/\1pres/g" fichier

On doit pouvoir faire la même chose avec perl. (je ne connais pas perl pour l'instant)
Ce qu'il y a d'interessant avec ta solution, MDW, c'est qu'on modifie directement le fichier. Avec sed c'est assez pénible de toujours devoir créer un nouveau fichier.

A Ciao.

Poste le Friday 11 March 2005 15:59:12
Répondre     Citer    
Re: Remplacement d'une chaine dans plusieurs fichiers
Envoyé par: MDW

Bonjour

Le '\b' n'est à priori pas reconnu par le sed (sauf peut-être des versions specifiques), les '\<' et '\>', les 'equivalants' de 'vi' ou 'ex' ne sont pas non plus connu dans sed.

En ce qui concerne perl, je le connais bien, mais pour faire des remplacements, on peut se permettre s'utiliser uniquement la fonction similaire de sed (s/.../.../...) avec bien plus de possibilités que sed (par example le '\b').
Par ailleurs, en sed je proposerai plutot:

sed -e "s/\([Aa]\)vant/\1pres/" fichier

Le probleme qui se pose avec savant peut-être résolu avec la solution suivante:

sed -e "s/\([ \t][Aa]\)vant\([ \t]\)/\1pres\2/g" -e "s/^\([Aa]\)vant\([ \t]\)/pres\1/" -e "s/\([ \t][Aa]\)vant$/\1pres/" -e "s/^\([Aa]\)vant$/\1pres/" fichier

Il faut donc répéter presque 4 fois la même expression, pour permettre que le mot soit en début de ligne, en fin de ligne, au milieu ou tout seul sur la ligne.

A+

MDW

Poste le Saturday 12 March 2005 22:05:27
Répondre     Citer    
Re: Remplacement d'une chaine dans plusieurs fichiers
Envoyé par: marcou

Citation
Fabrice Ledoux
for fichier in `ls *.txt` ; do sed
"s/Avant/Apres/" $fichier > tempfile ; mv
tempfile $fichier ; done

fonctionne mais bizarrement, certains ne sont pas
pris en compte. Par exemple, s'il y a
"qqchoseAprès", le "Après" n'est pas modifié.

Salut,

c'est juste pour remarquer que le `ls *.txt` dans la boucle for est inutile. On peut écrire simplement *.txt . La boucle for utilise une liste de nom et celle-ci est développée par le shell pas par la commande ls.

Ciao.

Poste le Tuesday 15 March 2005 16:19:16
Répondre     Citer    
Re: Remplacement d'une chaine dans plusieurs fichiers
Envoyé par: scaryman182

salut

voila j'ai un soucis avec sed

je cherche a remplacer le caracetere "," par un retour a la ligne

mais je connais pas le caractere pour renvoyer a la ligne:-(
malheureusement c pas comme en c
un sed -e "s/,/\r/g" fichier remplace mes virgules par des r

qq'un a une solution ? merci d'avance

Poste le Wednesday 16 March 2005 14:18:09
Répondre     Citer    
Re: Remplacement d'une chaine dans plusieurs fichiers
Envoyé par: ceric35

sed -e "s/,/\n/g"

-------------------------------------------------------------------------------------------------
Linux est pour la firme de Redmond ce qu'est James Bond pour les
méchants dans les films : le dernier obstacle avant la domination mondiale.

Poste le Wednesday 16 March 2005 15:12:12
Répondre     Citer    
Re: Remplacement d'une chaine dans plusieurs fichiers
Envoyé par: MDW

Bonjour

Il faut faire attention sous le shell. En general les simple apostrophe protegent l'antislash, tandis que les doubles n'évitent pas son interpretation par le shell.

Donc, il vaut probablement mieux:

sed -e 's/,/\n/g'

sinon

sed -e "s/,/\\n/g'

A+

MDW

Poste le Wednesday 16 March 2005 19:55:06
Répondre     Citer    
Re: Remplacement d'une chaine dans plusieurs fichiers
Envoyé par: MDW

Petite correction encore:

Citation
MDW
Bonjour

sed -e "s/,/\\n/g"

Poste le Wednesday 16 March 2005 19:56:07
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
Remplacement d'une chaine dans plusieurs fichiers
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons