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 04/03/2009, à 21:02

Concombre Masqué

[Résolu]Commande sur les fichiers d'un dossier (et sous dossiers)

Bonjour,

je cherche à effectuer un rechercher/remplacer dans tous les fichiers d'un dossier et ses sous-dossier.

Concrètement, chaque fichier a exactement le même bloc de code, que je veux remplacer par une seule ligne totalement différente : "MonRemplacement"

La manière la plus simple (je pense) est d'aller sous linux et d'utiliser vim (ou perl, parait que c'est pareil).

Voici la commande que j'utilise dans vim pour faire ce remplacement dans un seul fichier, avec les explications sur la syntaxe (expression régulière)

:s/<HEAD>\n\(^.*\n\)*<\/HEAD>/MonRemplacement

<HEAD>\n : le début du bloc (la première ligne), avec un retour à la ligne (\n)
"\(" et "\)" sont des parenthèses capturantes
"^.*\n" : toute ligne qui finit par un retour à la ligne
+ : autant de ligne que possible (et 1 au minimum)
</HEAD> : la fin du bloc


Et maintenant il s'agit d'ouvrir chaque fichier *.php du répertoire (récursivement), et de lancer cette commande vim.

Il est peut etre possible de le faire sans passer par vim, mais je ne suis pas un expert linux..

Je sais qu'il existe une syntaxe pleine de for($i=) mais je ne connais pas assez bien linux et je ne retrouve pas comment l'écrire.
A l'aide !


Merci d'avance smile

Dernière modification par Concombre Masqué (Le 05/03/2009, à 02:18)


Concombre Masqué, 100% Végétal et donc 100% sain

Hors ligne

#2 Le 04/03/2009, à 21:27

gigiair

Re : [Résolu]Commande sur les fichiers d'un dossier (et sous dossiers)

C'est find et sed qu'il te faut.
Essaye

find <répertoire de base> -name "*.php' -execdir sed -i 's/<HEAD>\n\(^.*\n\)*<\/HEAD>/MonRemplacement' '{}' ';'

Il vaut mieux tester sur un répertoire créé à cet effet. avant de lancer le bidule, car c'est très puissant et il n'y a pas de undo.
pour en savoir plus, info find, info sed.


--
JJR.

Hors ligne

#3 Le 04/03/2009, à 22:53

Concombre Masqué

Re : [Résolu]Commande sur les fichiers d'un dossier (et sous dossiers)

merci, je pense que ça risque de marcher, mais j'ai un autre problème, qui à l'air de venir du système cette fois ci : la recherche ne donne plus rien. Et meme si je fais une simple recherche sur le mot HEAD (par exemple), rien n'est trouvé dans le fichier, et encore moins remplacé :s

Je redémarre le système, on sait jamais...


Concombre Masqué, 100% Végétal et donc 100% sain

Hors ligne

#4 Le 04/03/2009, à 23:03

Totor

Re : [Résolu]Commande sur les fichiers d'un dossier (et sous dossiers)

Bonsoir,
Ce n'est pas dû à ton système.
sed fonctionne ligne à ligne, donc ton expression régulière ne sera pas vérifiée car elle fait référence à plusieurs lignes.

Désolé, je ne peux m'attarder... comme ça, sans approfondir le problème, j'utiliserai awk.


-- Lucid Lynx --

Hors ligne

#5 Le 04/03/2009, à 23:12

Concombre Masqué

Re : [Résolu]Commande sur les fichiers d'un dossier (et sous dossiers)

Tout à l'heure j'ai essayé cette même ligne de commande avec vim au lieu de sed, ça marchait, mais là ça ne marche plus...


Concombre Masqué, 100% Végétal et donc 100% sain

Hors ligne

#6 Le 05/03/2009, à 02:17

Concombre Masqué

Re : [Résolu]Commande sur les fichiers d'un dossier (et sous dossiers)

Résolu, grace à developpez.com, ubuntu-fr.org, et mes capacités mentales finalement pas si faibles smile

Je donne la solution, j'espère que ça servira à d'autre !

Script qui remplace un bloc <HEAD></HEAD> par <?php require('header.php') ?>

$ more script_header.sh
list=`find . -type f -name "*.php"`
for i in $list; do
    vim +':%s/<HEAD>\_.*<\/HEAD>/<?php require\(LANG."header.php"\); ?> ' +':wq' $i
done

Explication :
list=`find . -type f -name "*.php"`
find va chercher tout les fichiers (-type f) dont le nom (-name) est "*.php" , et mettre le résultat dans la variable list.

list est maintenant comme un fichier texte (mais temporaire) qui contient, dans chaque ligne, le chemin pour accéder à tout les fichiers php du dossier et de ses sous dossiers.

for i in $list; do [COMMANDE] done
pour chaque ligne de $list, effectuer [COMMANDE]

vim +':%s/<HEAD>\_.*<\/HEAD>/<?php require\(LANG."header.php"\); ?> ' +':wq' $i
vim est un éditeur de texte asses complexe. quelques notions : tapez ":i" pour écrire du texte. Pour sauvegarder, appuyez sur la touche d'échappement puis ":w", pour quitter ":q". Pour rechercher remplacer dans vim, on fait ":s/jecherche/jeremplace/". ":%s" c'est comme :s, mais l'expression cherchée peut etre étalée sur plusieurs lignes.

on peut éditer un fichier directement avec la commande vim monfichier.txt

on peut également lancer une commande (ou plusieurs) directement en ouvrant un fichier en faisant vim +':s/jecherche/jeremplace/' monfichier.txt

Cette ligne va donc lancer 2 commandes dans vim : la première effectue un remplacement, la seconde sauvegarde et quitte (les 2 d'un coup). A la fin de la ligne, le nom du fichier ($i puisque c'est la variable de la boucle).


Concombre Masqué, 100% Végétal et donc 100% sain

Hors ligne