Nils Posté 4 Mars 2005 Posté 4 Mars 2005 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.
Dan Posté 4 Mars 2005 Posté 4 Mars 2005 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"
Nils Posté 4 Mars 2005 Auteur Posté 4 Mars 2005 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.
Nils Posté 4 Mars 2005 Auteur Posté 4 Mars 2005 ps, j'ai retrouvé grâce à man sed la commande à laquelle je pensais : awk. (man grep ne renvoyais pas à sed)
Nils Posté 4 Mars 2005 Auteur Posté 4 Mars 2005 re, je vois que finalement -s et s///, sont 2 choses différentes, je me lance ...
Dan Posté 4 Mars 2005 Posté 4 Mars 2005 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"
Dan Posté 4 Mars 2005 Posté 4 Mars 2005 Encore Merci Dan, t'es formidable ! Pas de quoi ! J'ai surtout 25 ans de pratique Unix, ça aide
Nils Posté 7 Mars 2005 Auteur Posté 7 Mars 2005 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.
Dan Posté 7 Mars 2005 Posté 7 Mars 2005 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/shfor file in "*.php"do/bin/mv $file $file.oldsed 's/old_value/new_value/g' < $file.old > $filedone 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.
Nils Posté 7 Mars 2005 Auteur Posté 7 Mars 2005 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.
Nils Posté 7 Mars 2005 Auteur Posté 7 Mars 2005 heu ? il ne faudrait pas écrire : for $file in "*.php" plutôt ?
Dan Posté 7 Mars 2005 Posté 7 Mars 2005 heu ? il ne faudrait pas écrire : for $file in "*.php" plutôt ? 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
Nils Posté 7 Mars 2005 Auteur Posté 7 Mars 2005 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.
Tchinkatchuk Posté 27 Septembre 2005 Posté 27 Septembre 2005 (modifié) moi aussi ce ne me ferait pas de mal j'ai essayé d'utiliser ton petit script Dan et c'est la memerde #!/bin/shfor file in '*.php5'domv $file old/sed 's/Francia/Argentina/g' < 'old/'$file > $filedone 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é 27 Septembre 2005 par Tchinkatchuk
Tchinkatchuk Posté 27 Septembre 2005 Posté 27 Septembre 2005 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 *.php5do echo $file sed -e 's/Francia/Argentina/g' $file > out_tmp mv out_tmp $filedone 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
Dan Posté 27 Septembre 2005 Posté 27 Septembre 2005 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.
Tchinkatchuk Posté 29 Septembre 2005 Posté 29 Septembre 2005 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 !
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant