Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/04/2005, 16h40   #1
Nouveau Membre du Club
 
Inscription : juillet 2003
Messages : 47
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 47
Points : 27
Points : 27
Envoyer un message via MSN à totofweb
Par défaut Find & replace sur un ensemble de fichiers

Bonjour
Sous windows je faisais ça avec dreamweaver : il donnait la possibilité de faire un "find & replace" en choisissant un dossier et il ouvrait tous les fichiers de ce dossier et remplaçait les chaînes de caractères concernées.

Sous linux je ne vois pas trop comment faire. Quel logiciel le permet ? Sinon comment puis-je me faire un petit script shell pour ça ?

Merci
Totofweb
totofweb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2005, 17h47   #2
Membre du Club
 
Inscription : février 2005
Messages : 68
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 68
Points : 45
Points : 45
Il n'y a pas de logiciel appropriés, il faut faire un script en combinant la commande find et la commande sed.
Code :
sed -e 's/$VAR1/$VAR2/g' fichier
te permet de remplacer les occurences $VAR1 par $VAR2 dans tout le fichier....
mollux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2005, 17h53   #3
Membre Expert
 
Avatar de narmataru
 
Inscription : décembre 2002
Messages : 1 423
Détails du profil
Informations personnelles :
Âge : 31
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : décembre 2002
Messages : 1 423
Points : 1 491
Points : 1 491
Bonsoir

Voici un petit script qui devrait correrspondre à ce que tu cherche :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
#! /bin/bash
 
# Je génère une fichier temporaire et je récupère son nom
TEMPFILE=$(tempfile)
 
# Je récupère la liste des fichiers qui contiennent le motif $1 à partir du répertoire $3
LISTFILE=$(grep -l -R $1 $3)
 
# Je traite chacun des fichiers récupérés
for f in $LISTFILE ; do
        # Je modifié le motif $1 par la chaine $2 et je redirige la sortie de sed dans le fichier temporaire
	sed -e "s/$1/$2/g" $f > $TEMPFILE
        # Je fais une sauvegarde du fichier d'origine au cas ou :)
	cp $f ${f}~
        # j'écrase l'ancien fichier par le nouveau
	cp $TEMPFILE $f
done
# j'efface le fichier temporaire
rm -f $TEMPFILE
usage :
(si ce script est copié dans un fichier replace.sh)
./replace "toto" "titi" /tmp/dir : remplace "toto" par "titi" dans tous les fichiers de /tmp/dir et ses sous répertoires
./replace "toto" "titi" /tmp/dir/*.html : ne remplace "toto" par "titi" que dans les fichier .html de /tmp/dir et pas dans les sous répertoire.



et voilou
__________________
Reportage d'Arte sur Linux
narmataru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2005, 18h07   #4
Nouveau Membre du Club
 
Inscription : juillet 2003
Messages : 47
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 47
Points : 27
Points : 27
Envoyer un message via MSN à totofweb
Ok merci pour le script.

Je trouve quand même dommage d'avoir autant d'éditeurs mais pas un seul qui sache effectuer cette opération pourtant pas si compliquée mais fort utile.
totofweb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2005, 18h19   #5
Membre Expert
 
Avatar de narmataru
 
Inscription : décembre 2002
Messages : 1 423
Détails du profil
Informations personnelles :
Âge : 31
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : décembre 2002
Messages : 1 423
Points : 1 491
Points : 1 491
mais qui a dit qu'ils ne savaient pas le faire ?
Les éditeurs vi et xemacs, par exemple, sont très puissant et je suis sure qu'en cherchant un peu dans leur commandes on doit pouvoir y arriver mais un script est si simple (de plus tous les éditeurs permettent de lancer des commandes externes...)
__________________
Reportage d'Arte sur Linux
narmataru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2005, 20h19   #6
Membre Expert
 
Avatar de becket
 
Frédéric Brugmans
Informaticien multitâche
Inscription : février 2005
Messages : 661
Détails du profil
Informations personnelles :
Nom : Frédéric Brugmans

Informations professionnelles :
Activité : Informaticien multitâche

Informations forums :
Inscription : février 2005
Messages : 661
Points : 1 196
Points : 1 196
Toujours en bash, mais plus court

Code :
1
2
3
4
5
for i in $( find ./ -type f  ) 
 do  
   sed -e s/EXPRESSION1/EXPRESSION2/g  $i > $i.bak
   mv $i.bak $i 
done
becket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2005, 21h47   #7
ovh
Rédacteur
 
Avatar de ovh
 
Homme
Ingénieur développement logiciels
Inscription : mai 2002
Messages : 3 725
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : mai 2002
Messages : 3 725
Points : 6 310
Points : 6 310
Encore plus court, à tester :
Code :
find . -name "*.cpp" | xargs sed -e s/regexp1/regexp2/
(sert à remplacer qqch dans tous les fichiers cpp récurisvement à partir du répertoire courant)

La commande xargs transmet chaque ligne de résultat de la première en commande en argument de la seconde commande 8)
__________________
Tutoriels sur les UPS, e-commerce, PHP, critiques de livres...

Ce forum est fait pour vous et surtout par vous, merci d'en respecter les règles.
Je n'ai rien à voir avec la société www.ovh.com !
ovh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2005, 22h02   #8
Membre Expert
 
Avatar de becket
 
Frédéric Brugmans
Informaticien multitâche
Inscription : février 2005
Messages : 661
Détails du profil
Informations personnelles :
Nom : Frédéric Brugmans

Informations professionnelles :
Activité : Informaticien multitâche

Informations forums :
Inscription : février 2005
Messages : 661
Points : 1 196
Points : 1 196
Encore plus court ... mais qui ne fait pas la meme chose car il manque la modification des fichiers
becket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2005, 23h08   #9
Membre Expert
 
Avatar de narmataru
 
Inscription : décembre 2002
Messages : 1 423
Détails du profil
Informations personnelles :
Âge : 31
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : décembre 2002
Messages : 1 423
Points : 1 491
Points : 1 491
le script que j'ai proposé n'est pas beaucoup plus long que les autres si on enlève les commentaires
De plus si on enlève la sauvegarde du fichier d'origine et la suppression du fichier temporaire il n'y a plus aucune différence

becket >> le .bak de ton script n'est pas la sauvegarde du fichier d'origine

__________________
Reportage d'Arte sur Linux
narmataru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2005, 00h02   #10
Membre Expert
 
Avatar de narmataru
 
Inscription : décembre 2002
Messages : 1 423
Détails du profil
Informations personnelles :
Âge : 31
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : décembre 2002
Messages : 1 423
Points : 1 491
Points : 1 491
Voici la commande pour le faire sous un éditeur, au hasard vi :

ouvrir vi :
Citation:
#vi
Charger les fichiers dans les buffers (par exemple ouvrir tous les fichier .c et .h d'un répertoire) :
Citation:
:args /path1/path2/.../*.[ch]
Effectuer une commande sur l'ensemble des buffers, par exemple la commande qui remplace 'toto' par 'titi' sur l'ensemble d'un fichier et même s'il y a plusieurs occurence par ligne, sans confirmation :
Citation:
:bufdo %s/toto/titi/g
La même commande en enregistrant automatiquement les modifications et en confirmant les modifications :

Citation:
:bufdo %s/toto/titi/gc | update
il est trop fort ce vi
__________________
Reportage d'Arte sur Linux
narmataru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2005, 00h53   #11
Membre Expert
 
Avatar de becket
 
Frédéric Brugmans
Informaticien multitâche
Inscription : février 2005
Messages : 661
Détails du profil
Informations personnelles :
Nom : Frédéric Brugmans

Informations professionnelles :
Activité : Informaticien multitâche

Informations forums :
Inscription : février 2005
Messages : 661
Points : 1 196
Points : 1 196
Citation:
Envoyé par narmataru
le script que j'ai proposé n'est pas beaucoup plus long que les autres si on enlève les commentaires
De plus si on enlève la sauvegarde du fichier d'origine et la suppression du fichier temporaire il n'y a plus aucune différence

becket >> le .bak de ton script n'est pas la sauvegarde du fichier d'origine

1 - Ton script est toujours plus long de deux petites lignes meme avec tout ce tu as enlevé

2 - Pourquoi faire une copie de sauvegarde d'un fichier que l'on ne modifie pas ... On cree un nouveau fichier qui est modifié.
becket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2005, 01h56   #12
Membre Expert
 
Avatar de narmataru
 
Inscription : décembre 2002
Messages : 1 423
Détails du profil
Informations personnelles :
Âge : 31
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : décembre 2002
Messages : 1 423
Points : 1 491
Points : 1 491
Citation:
Envoyé par becket
2 - Pourquoi faire une copie de sauvegarde d'un fichier que l'on ne modifie pas ... On cree un nouveau fichier qui est modifié.
Code :
1
2
3
4
5
 
        # Je fais une sauvegarde du fichier d'origine au cas ou :)
   cp $f ${f}~
        # j'écrase l'ancien fichier par le nouveau
   cp $TEMPFILE $f
bien sure qu'il est modifié le fichier $f mais une sauvegarde est fait au préalable au cas ou on veut revenir en arrière

Dans ton script $i et ${i}.bak ont les même donnée, non ?
__________________
Reportage d'Arte sur Linux
narmataru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2005, 06h51   #13
Membre Expert
 
Avatar de becket
 
Frédéric Brugmans
Informaticien multitâche
Inscription : février 2005
Messages : 661
Détails du profil
Informations personnelles :
Nom : Frédéric Brugmans

Informations professionnelles :
Activité : Informaticien multitâche

Informations forums :
Inscription : février 2005
Messages : 661
Points : 1 196
Points : 1 196
Citation:
Envoyé par becket
Citation:
Envoyé par narmataru

becket >> le .bak de ton script n'est pas la sauvegarde du fichier d'origine


2 - Pourquoi faire une copie de sauvegarde d'un fichier que l'on ne modifie pas ... On cree un nouveau fichier qui est modifié.
Je parlais de mon script :

Citation:
Envoyé par becket
sed -e s/EXPRESSION1/EXPRESSION2/g $i > $i.bak
A ce moment, tu as deux fichiers : un $i.bak qui est le fichier modifié et un $i qui est le fichier non modifié
becket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2005, 12h30   #14
Futur Membre du Club
 
Inscription : novembre 2003
Messages : 38
Détails du profil
Informations forums :
Inscription : novembre 2003
Messages : 38
Points : 17
Points : 17
Citation:
Envoyé par becket
Toujours en bash, mais plus court

Code :
1
2
3
4
5
for i in $( find ./ -type f  ) 
 do  
   sed -e s/EXPRESSION1/EXPRESSION2/g  $i > $i.bak
   mv $i.bak $i 
done
salut !

Et si on ne veut remplacer que le mot entier ?
Par exemple remplacer tous les "normal" par "Normal" (donc pas dans "normalIndex" par exemple)
djbed est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2005, 14h29   #15
Futur Membre du Club
 
Inscription : novembre 2003
Messages : 38
Détails du profil
Informations forums :
Inscription : novembre 2003
Messages : 38
Points : 17
Points : 17
bon finalement j'ai trouvé, ct pas tres dur mais ca fais longtemps que j'ai pas touché à ca... j'ai donc utilisé "\ Expression\ " pour ne trouver que mon mot entier.
A +
djbed est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h17.


 
 
 
 
Partenaires

Hébergement Web