IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Comment faire des remplacements dans des fichiers (sed + regex)


Sujet :

Shell et commandes GNU

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 3
    Points : 8
    Points
    8
    Par défaut Comment faire des remplacements dans des fichiers (sed + regex)
    Bonjour,

    Je cherche à remplacer les occurrences suivantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $_POST[toto]
    $_REQUEST[tata]
    $_SESSION[tutu]
    $tab[truc]

    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $_POST['toto']
    $_REQUEST['tata']
    $_SESSION['tutu']
    $tab['truc']

    sur tous les fichiers PHP contenus dans un dossier en ligne de commande.
    Je migre de PHP 5.2 à 5.4 et forcément les variables tableaux sans quotes ç a ne passe pas... J'ai plus de 30000 variables à corriger et à la main c'est chaud...

    La piste que j'ai trouvé pour l'instant est d'utiliser une commande du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     find . -name "*.php" -print | xargs sed -i.old -r "s/\$_(?:[a-zA-Z])*\[(?:[a-zA-Z])*\]/\$_(?:[a-zA-Z])*\['(?:[a-zA-Z])*'\]/g"
    ça dervrait remplacer les variables globales $_TRUC[string] par $_TRUC['string'] mais ça ne marche pas.

    Est ce que quelqu'un peut m'aider ?
    Merci.

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 578
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 578
    Points : 19 440
    Points
    19 440
    Par défaut
    Bonjour,

    par exemple, ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sed 's/\([^[]*\[\)\([^]]*\)/\1'\''\2'\''/' <<<'$_POST[toto]
    $_REQUEST[tata]
    $_SESSION[tutu]
    $tab[truc]'
    ?

    et si c'est bon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -name "*.PHP" -exec sed -i.old 's/\([^[]*\[\)\([^]]*\)/\1'\''\2'\''/' {} \;
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 3
    Points : 8
    Points
    8
    Par défaut
    alors j'ai crée un fichier de test contenant ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
     
    $test = $_HFFHJGG[khefjkehfekhf];
    $pipo[eeee][dddd] = $_jkhzdzd[ekhfekhf];
    $pipo["eeee"] = $_jkhzdzd[ekhfekhf];
     
    $_SESSION[AAA]= $GET[lejsBV] = $_REQUEST[Asddo];
    On devrait obtenir ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <?php
     
    $test = $_HFFHJGG['khefjkehfekhf'];
    $pipo['eeee']['dddd']= $_jkhzdzd['ekhfekhf'];
    $pipo["eeee"] = $_jkhzdzd['ekhfekhf'];
     
    $_SESSION['AAA']= $GET['lejsBV'] = $_REQUEST['Asddo'];


    après avoir executé la commande, j'obtiens ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <?php
     
    $test = $_HFFHJGG['khefjkehfekhf'];
    $pipo['eeee'][dddd] = $_jkhzdzd[ekhfekhf];
    $pipo['"eeee"'] = $_jkhzdzd[ekhfekhf];
     
    $_SESSION['AAA']= $GET[lejsBV] = $_REQUEST[Asddo];

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Bonjour,

    par exemple, ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sed 's/\([^[]*\[\)\([^]]*\)/\1'\''\2'\''/' <<<'$_POST[toto]
    $_REQUEST[tata]
    $_SESSION[tutu]
    $tab[truc]'
    ?

    et si c'est bon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -name "*.PHP" -exec sed -i.old 's/\([^[]*\[\)\([^]]*\)/\1'\''\2'\''/' {} \;
    Je ne connais pas PHP et je ne peux donc pas savoir si ma remarque est pertinente ou non

    La proposition de N_BaH consiste à introduire des simples quotes autour de toute chaîne qui est entre crochets, ie changer toute occurrence de [quelque chose] par ['quelque chose'], quel que soit le contexte.
    En particulier, si on a quelque chose comme print('Ceci est une [trace]'), il sera transformé en print('Ceci est une ['trace']')... et je ne sais pas si ça peut arriver et être gênant!

    De plus, il manque le 'g' final pour répéter la commande s'il y a plusieurs occurrences dans la même ligne.

    Une modification plus ciblée serait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e "s/\(\$[a-zA-Z_]*\[\)\([a-zA-Z_]*\)\]/\1'\2'\]/g"
    qui ajoute des quotes autour d'un mot (formé de lettres et underscores) lorsque celui-ci est entre crochets et précédé d'un mot (formé de lettres et underscores) lui-même précédé du caractère '$'.

    Oops! je n'avais pas vu la réponse de vinok972

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par vinok972 Voir le message
    alors j'ai crée un fichier de test contenant ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
     
    $test = $_HFFHJGG[khefjkehfekhf];
    $pipo[eeee][dddd] = $_jkhzdzd[ekhfekhf];
    $pipo["eeee"] = $_jkhzdzd[ekhfekhf];
     
    $_SESSION[AAA]= $GET[lejsBV] = $_REQUEST[Asddo];
    On devrait obtenir ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <?php
     
    $test = $_HFFHJGG['khefjkehfekhf'];
    $pipo['eeee']['dddd']= $_jkhzdzd['ekhfekhf'];
    $pipo["eeee"] = $_jkhzdzd['ekhfekhf'];
     
    $_SESSION['AAA']= $GET['lejsBV'] = $_REQUEST['Asddo'];


    après avoir executé la commande, j'obtiens ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <?php
     
    $test = $_HFFHJGG['khefjkehfekhf'];
    $pipo['eeee'][dddd] = $_jkhzdzd[ekhfekhf];
    $pipo['"eeee"'] = $_jkhzdzd[ekhfekhf];
     
    $_SESSION['AAA']= $GET[lejsBV] = $_REQUEST[Asddo];
    Merci pour cet exemple! Il peut servir de specs par similitude!

    Avec ma méthode ciblée, je ne sais pas gérer les tableaux multidimensionnels

    Pour revenir à une méthode moins ciblée, on pourrait faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e "s/\[\([a-zA-Z_]*\)\]/['\1']/g"

Discussions similaires

  1. Faire des remplacements dans un fichier texte
    Par DooSquare dans le forum C
    Réponses: 6
    Dernier message: 06/07/2007, 18h22
  2. Réponses: 1
    Dernier message: 09/05/2007, 23h10
  3. Remplacer / Supprimer des données dans un fichier txt
    Par PedroBD dans le forum Langage
    Réponses: 3
    Dernier message: 03/07/2006, 13h33
  4. [DBF] Comment faire une insertion dans le fichier ?
    Par dor_boucle dans le forum Autres SGBD
    Réponses: 1
    Dernier message: 14/12/2005, 07h46
  5. Comment faire une insertion dans un fichier texte ?
    Par Isa31 dans le forum Langage
    Réponses: 10
    Dernier message: 28/12/2004, 09h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo