Aller au contenu

Unix : remplacer une chaine par une autre


Nils

Sujets conseillés

Bonjour,

je ne me rappelle plus de la commande Unix (Linux) qui permet de changer une chaîne de caractères par une autre dans un lot.* de fichiers.

idem grep, mais avec remplacement en plus, je crois qu'il y a un w dans la commande.

merci.

Nils.

Lien vers le commentaire
Partager sur d’autres sites

Salut Nils,

Il s'agit de la commande "sed" pour Stream EDitor

Une commande telle que

echo "vive moi" | sed 's/moi/Nils/'

donnera comme résultat: "vive Nils" ;)

Lien vers le commentaire
Partager sur d’autres sites

Merci Dan !!!

Tu pourrais m'aider, à construire la commande pour un lot de fichiers ?

est-ce que cela est juste ? :

sed 's/ancien/nouveau/' file*.php

tu peux m'expliquer l'intérêt de l'option -s (--separate) ?

merci.

Lien vers le commentaire
Partager sur d’autres sites

ps, j'ai retrouvé grâce à man sed la commande à laquelle je pensais : awk.

(man grep ne renvoyais pas à sed)

Lien vers le commentaire
Partager sur d’autres sites

re, je vois que finalement -s et s///, sont 2 choses différentes, je me lance ...

Lien vers le commentaire
Partager sur d’autres sites

awk est un programme permettant de rechercher des "patterns" dans des fichiers, mais "sed" est un éditeur.

Dans ton cas, il faut utiliser "sed" ;)

Dan

PS: s signifie "substitute"

Lien vers le commentaire
Partager sur d’autres sites

Encore Merci Dan, t'es formidable !  ;)

Pas de quoi !

J'ai surtout 25 ans de pratique Unix, ça aide ;)

Lien vers le commentaire
Partager sur d’autres sites

hello, Dan

Bon désolé, mais je reviens, je n'arrive pas à tirer parti de la commande sed, c'est comme si elle n'écrivait rien dans les fichiers, mais juste à l'écran (je suis root quand je l'utilise). Et rien trouvé sur le web qui dise qu'il faille spécifier une option pour forcer l'écriture.

voici la commande que j'utilise :

sed 's/old_value/new_value/gw result' *.php

et bien à chaque exécution, result contient la même chose, alors qu'en fait, à la 2ième exécution, avec le même patern, résult devrait être vide il me semble, et de plus, à l'exécution de mon site, où à la lecture des fichiers, pas de modif !

As-tu une idée, où est-ce que je rate quelque chose ?

Merci Dan.

Lien vers le commentaire
Partager sur d’autres sites

Sed est un "stream editor", c'est à dire qu'il agit "dans le flux" d'une série de commandes qui sont soit les pipes, soit les redirections.

Si tu dois effectuer des commandes sur un nombre important de fichiers, il faut donc enrober cela d'un petit script en shell, par exemple:

#!/bin/sh
for file in "*.php"
do
/bin/mv $file $file.old
sed 's/old_value/new_value/g' < $file.old > $file
done

Cela te laisse les anciens fichiers en *.php.old et les nouveaux en *.php

Si tu veux effacer les anciens fichiers, tu peux ajouter une ligne avant la ligne "done"

/bin/rm $file.old

Ne le fais pas tout de suite, au moins cela te donne un "droit à l'erreur" au cas où ta manip n'est pas bonne.

Lien vers le commentaire
Partager sur d’autres sites

Dan,

Je comprends mieux pourquoi ça ne marchait pas, pourtant, j'avais trouvé un exemple sur le www avec sed '...' *.htm mais bon en tout cas, ça ne marche pas !

Sinon, si tu as un moment, un peu plus tard, je n'arrive pas à interpréter les redirections < et >. En fait il ne faut plus raisonner en noms de fichiers mais en $variable, c'est qq chose comme ça ?

en fait il faut lire :

ma_commande /// <ce_qui_rentre /// >ce_qui_sort, et bien mettre des séparations imaginaires (///) là où n'y a que des espaces. non ?

Et la commande mv (move ?), fait une copie ou un déplacement ?, si déplacement, comment se fait-il que l'on conserve le fichier d'origine ?

En tous cas, merci pour le shell-script !

à+,

Nils.

Lien vers le commentaire
Partager sur d’autres sites

heu ? il ne faudrait pas écrire : for $file in "*.php" plutôt ?  :unsure:

Non non... "for file in...."

C'est une déclaration de variable, pas une utilisation.

En ce qui concerne la commande mv , elle déplace (renomme) le fichier en fichier.old

Ensuite le sed < $file.old > $file prend en entrée ce fichier.old et crée une sortie "fichier" (valeur de $file)

Je pense qu'un petit bouquin sur Linux ne te ferait pas de tort ;)

Dan

Lien vers le commentaire
Partager sur d’autres sites

Merci Dan pour les détails !

Et oui, quand on pratique pas on perd ! irrémédiablement.

effectivement le > crée un fichier, c'est vrai !

Et la déclaration des variables, pas de $, $ seulement pour lire la variable !

Tu sais, à faire que du PHP, j'en ai oublié la syntaxe Unix, mais n'ayant eu que des formations, et pas de mission Unix, les automatismes ne se sont pas mis en place (à mon grand regret, et comme les clients ne veulent que des confirmés, quand on n'est plus débutant, mais que malgré tout on débute, tout devient plus difficile..., c'est de la pratique intensive qu'il me manque en fait).

Enfin, ça revient à la lecture de tes explications complémentaires, ouf, je ne suis pas devenu complétement hermétique !

Merci, à la prochaine, sur le HUB !! ;)

Nils.

Lien vers le commentaire
Partager sur d’autres sites

  • 6 months later...

moi aussi ce ne me ferait pas de mal

j'ai essayé d'utiliser ton petit script Dan et c'est la memerde

#!/bin/sh
for file in '*.php5'
do
mv $file old/
sed 's/Francia/Argentina/g' < 'old/'$file > $file
done

Je fais un move a la place d'un rename car le mv avec extension .old ne fonctionne pas !

le probleme est que le < 'old/'$file ou <old/$file n'est pas accepté. Il ne le prend pas comme une variable mais comme une chaine de caractère. Il recherche old/*.php5

Le move fonctionne mais pas le sed avec $file.

Quelqu'un peut-il m'aider, je suis sur que c'est tout bête.

Merci d'avance.

Modifié par Tchinkatchuk
Lien vers le commentaire
Partager sur d’autres sites

Bon ben c'est bon.

Bizarrement, il ne me fallait pas le " autour de php5 a partir du moment ou aucun des noms de fichiers ne contient d'espaces

Voici le code pour ma part

for file in *.php5
do
       echo $file
       sed -e 's/Francia/Argentina/g' $file > out_tmp
       mv out_tmp $file
done

Merci a tous et bonne jounée

Au fait, Dan, tu aurais un bouquin a conseiller sur l'administration Linux, etc pour un debutant ?

J'en demande peut etre beaucoup :boude:;)

Lien vers le commentaire
Partager sur d’autres sites

Salut Tchinkatchuk,

Dans l'expression '*.php5' (avec les simples quotes) le * n'est pas interprété et il recherche donc un fichier dont le nom est littéralement' *.php5'.

Il ne trouve donc rien et c'est normal.

Ton deuxième code est le bon. ;)

Je n'ai malheureusement pas de bouquin à te proposer. Mais si tu as un serveur dédié tu trouveras toute la doc en ligne avec la commande 'man'. Essaies 'man man' pour savoir comment utiliser cette commande.

Lien vers le commentaire
Partager sur d’autres sites

JE te remercie.

J'ai en effet utilisé le man mais ce que je ne comprenais pas, c'est qu'il interpretait bien le '*.php5' dans le sed mais pas dans la sortie '>'.

Pour le bouquin je trouverais, il y a ptet un sujet qui en prle d'ailleurs, j'aurais besoin de me confirmer en adminbistration !

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...