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 27/11/2007, à 10:00

pT-benj

[Résolu] Un commande Linux de remplacement de caractères

Bonjour à  tous, voila j'ai un petit problème (j'éspère avoir posté au bon endroit sinon excusez moi par avance)

Je voudrais remplacer dans tous les fichiers du dossier test le mot "PRODUIT" par "produit".

En clair, j'ai un dossier et je voudrais changer la casse de tous les mots "produit" dans tous les fichiers du dossier X et dans tous ses sous dossiers.

Je sais que je peux faire cela grà¢ce à  la ligne de commande mais comment?
Quel est la syntaxe pour cette opération?

Je vous remercie par avance de vos reponses et vous souhaite une bonne journée.:)

Dernière modification par pT-benj (Le 27/11/2007, à 13:31)

Hors ligne

#2 Le 27/11/2007, à 11:03

Philoux

Re : [Résolu] Un commande Linux de remplacement de caractères

Bon alors déjà voila le tit script (à exécuter dans ton répertoire test):

$ for i in `find . -type f`; do cat $i | sed -re "s/PRODUIT/produit/" > $i.bak && mv $i.bak $i; done

Histoire de pas te cracher une réponse comme ça qui ne te servira qu'une fois voila ce qu'il fait :
tout d'abord il liste l'ensemble des fichiers de ton répertoire test. Si tu exécute la commande

$ find . -type f

Il t'affiche l'ensemble des fichier du répertoire "." (cad. du répertoire courant) et de ses sous-répertoires.
Ensuite, je rentre cette commande dans une boucle. Ainsi le for in in find ..., va prendre chaque fichier renvoyé par la commande find un à un et mettre son nom (son chemin plus exactement) dans la variable $i.
Ensuite pour chaque fichier, je fait un cat dessus (je le lit en fait), et je renvoie son contenu vers une autre commande qui s'appelle sed. (en utilisant un pipe : le "|" que tu vois).
Sed permet de faire des remplacement de motifs en utilisant des expression rationnelles. Bon ici c'est facile, on lui fait remplacer PRODUIT par produit. le s// signifie "substituer le premier élément par le second".
Par défaut, sed envoie le résultat sur l'écran... ça ne nous convient pas, alors on redirige le résultat vers le fichier, mais avec un petit .bak comme extension.
En fait, si on renvoyait le résultat vers le fichier source directement... ça pose problème car il réécrit par dessus ce qu'il est en train de lire, c'est génant.
Et donc, ensuite, je renomme le fichier, en enlevant le .bak.
Et hop, fin de la boucle, on passe au fichier suivant. smile

--
Philippe Thierry.


Philippe Thierry.

Hors ligne

#3 Le 27/11/2007, à 11:56

teke

Re : [Résolu] Un commande Linux de remplacement de caractères

Woua... c'est de la belle ligne de commande ça. Pour ma culture perso (je ne suis pas un spécialiste), pourquoi choisir de faire "$i.bak && mv $i.bak $i" au lieu de rajouter l'option -i à  sed ?

#4 Le 27/11/2007, à 12:01

Philoux

Re : [Résolu] Un commande Linux de remplacement de caractères

héhé smile
l'habitude wink
En fait j'ai travaillé avec sed sur plusieurs os, (des netbsd entre autres), et c'est très pénible car les options sont différentes à  chaque fois. Donc à  force, je préfère faire utiliser des trucs qu'on retrouve partout (ici une redirection) que devoir regarder le man pour voir quel est le nom de telle option dans tel OS.

Maintenant tu as tout à  fait raison, avec -i ça marche aussi bien et c'est plus joli smile


Philippe Thierry.

Hors ligne

#5 Le 27/11/2007, à 12:24

teke

Re : [Résolu] Un commande Linux de remplacement de caractères

heu... je ne pensait vraiment pas qu'il puisse y avoir de pareilles différences ! bon j'utilise linux depuis 1996, mais je n'ai toujours été que sur debian (et un essais sous suze) ou alors sur des passerelles clef en main que je ne bidouillait pas (e-smith).

Comment ce fait-ils que les dev n'aient pas gardés les même options ? cela me semble tellement idiot... il doit pourtant y avoir une raison logique à  ce choix... peut être pour unifier les options des différents log sur une même plat-forme ?

#6 Le 27/11/2007, à 12:35

Philoux

Re : [Résolu] Un commande Linux de remplacement de caractères

Oui je suis d'accord c'est assez ridicule. C'est le même problème avec grep en fait. Pour sed, sous netbsd tu remplace -e par -s (si ma mémoire est bonne), le -r devient -E, etc...

Bref, c'est pénible.


Philippe Thierry.

Hors ligne

#7 Le 27/11/2007, à 12:37

le ninja_rose

Re : [Résolu] Un commande Linux de remplacement de caractères

$ for i in `find . -type f`; do cat $i | sed -re "s/PRODUIT/produit/" > $i.bak && mv $i.bak $i; done

Heu, c'est possible. Ou en 2007, => kfilereplace

#8 Le 27/11/2007, à 12:44

Alain.g

Re : [Résolu] Un commande Linux de remplacement de caractères

Si je peux me permettre deux petites remarques par rapport à  la solution de Philoux :
Il faudrait changer la valeur de l'IFS (par exemple IFS=$'\n'), sinon ça ne marchera tout simplement pas si les fichiers/dossiers contiennent des espaces (notamment)

à€ part sed, il faudrait ajouter le modificateur g à  sed, sinon seule la première occurrence  d'une ligne sera remplacée (g pour global)

Une solution plus légère serait d'utiliser directement l'option -exec de find :

find . -type f -exec sed -i 's/PRODUIT/produit/g' {} \;

à€ part find, une autre solution serait d'utiliser grep

grep -R -l  'PRODUIT' * | while read i ; do sed -i  's/PRODUIT/produit/g' "$i" ; done

l'option -R pour récursif, l'option -l pour remplacer la sortie normal par le chemin du fichier.
Je ne sais pas laquelle serait la plus rapide.

Dernière modification par Alain.g (Le 27/11/2007, à 12:51)


Xubuntu Karmic !

Hors ligne

#9 Le 27/11/2007, à 12:46

Philoux

Re : [Résolu] Un commande Linux de remplacement de caractères

Effectivement smile mais bon... il reste encore qques vieux schnoks comme nous qui aiment bien leur shell et le toucher molletonné de leurs lignes de commande tongue


Philippe Thierry.

Hors ligne

#10 Le 27/11/2007, à 12:52

le ninja_rose

Re : [Résolu] Un commande Linux de remplacement de caractères

Philoux a écrit :

il reste encore qques vieux schnoks comme nous qui aiment bien leur shell et le toucher molletonné de leurs lignes de commande tongue

Ha d'accord.
Je trouvais ça bizarre ce genre de questions en 2007, à  moins d'avoir du temps, et de ne pas craindre quelques erreurs de "-_$#&!!&(?@?" si vite arrivées.....

#11 Le 27/11/2007, à 13:04

Alain.g

Re : [Résolu] Un commande Linux de remplacement de caractères

Justement les lignes de commande/script peuvent faire gagner beaucoup de temps, surtout pour les tà¢ches répétitives...

Même en 2007, je vois mal comment tu uiliserais kfilereplace dans un script ;-)

Et puis même, entre taper sed -i 's/search/replace/g' * ou aller dans le menu chercher kfilereplace puis le configurer pour faire l'opération en question, je vais plus plus vite à  le faire avec sed...

Dernière modification par Alain.g (Le 27/11/2007, à 13:09)


Xubuntu Karmic !

Hors ligne

#12 Le 27/11/2007, à 13:16

le ninja_rose

Re : [Résolu] Un commande Linux de remplacement de caractères

Certainement oui, à  condition de vérifier si les options n'ont pas changé d'une version linux ou unix à  l'autre, et d'avoir pris le temps de tester avant.

$ for i in `find . -type f`; do cat $i | sed -re "s/PRODUIT/produit/" > $i.bak && mv $i.bak $i; done
C'est joli, mais une erreur est si vite arrivée.
Enfin chacun s'amuse comme il peut, à  moins d'y être contraint par absence d'interface graphique, et d'avoir vraiment besoin d'un script pour une opération répétitive (ce qui ne semble pas être le cas)
(pas très utile mon commentaire, mais je me méfie de la frime de ligne de commande à  rallonge, même si j'en ai déjà  vu des beaucoup plus longues / au moins une ligne et demi sur un écran 17").

#13 Le 27/11/2007, à 13:30

pT-benj

Re : [Résolu] Un commande Linux de remplacement de caractères

Wouahou:D

Merci beaucoup, en effet cela fonctionne parfaitement...
J'ai utilisé cette commande :

find ./. -type f -exec sed -i 's/PRODUIT/produit/g' {} \;

Merci 1000 fois à  tous

Hors ligne

#14 Le 27/11/2007, à 13:36

Alain.g

Re : [Résolu] Un commande Linux de remplacement de caractères

Bon le ninja_rose, merci d'avoir signalé à  pT-benj l'existence de kfilereplace, même si ce n'était pas malin de l'avoir fait d'une manière si trollesque ;-)

Attention toutefois à  l'installation de kfilereplace sur Ubuntu ou Xubuntu, cela risque d'installer beaucoup de librairies si aucune application KDE n'a déjà  été installée.

Dernière modification par Alain.g (Le 27/11/2007, à 13:38)


Xubuntu Karmic !

Hors ligne

#15 Le 27/11/2007, à 13:40

Philoux

Re : [Résolu] Un commande Linux de remplacement de caractères

le ninja_rose a écrit :

(pas très utile mon commentaire, mais je me méfie de la frime de ligne de commande à  rallonge, même si j'en ai déjà  vu des beaucoup plus longues / au moins une ligne et demi sur un écran 17").

Fort heureusement ce n'est pas la longueur de la ligne qui en fait la qualité (c'est plutà´t l'inverse d'ailleurs). Comme tu le vois, la solution avec le -exec du find est plus courte et plus efficace.
Après pour ce qui est de la frime... je vois pas l'intérêt sur un forum d'aide... De plus frimer avec du sed ou du grep dans une ligne de commande.... vu le nombre de personnes qui savent faire ça, il n'y a pas de quoi frimer wink
Maintenant c'est vrai qu'il y a ceux qui aiment utiliser leur console régulièrement, qui sont habitués aux lignes de commandes tout simplement parce qu'ils ont appris à  s'en servir à  une époque ou les interfaces graphiques sous linux ne permettaient absolument pas de s'en passer et ceux qui au contraire sont habituer à  un modèle graphique.
Les deux points de vue se défendent. Mais n'oublies pas qu'il n'y aurait aucune interface graphique comme kfilereplace si il n'y avait pas de langage de script derrière...


Philippe Thierry.

Hors ligne