Expressions régulières avec egrep et sed

Résolu
Regexeur -  
 Regexeur -
Bonjour,

Pouvez-vous m'aider à trouver une regex me permettant de trouver dans mes fichier php les chaines de caractères définies entre double quotes et qui ne contiennent pas le caractère $.
Je souhaiterai en faite optimiser mes sources php, nottament en remplacent les doubles quotes par des simples quotes pour eviter l'interpretation de la chaine si cela n'est pas necessaire.
Voici un exemple :

<html>
<body>
<p style="font-weight:bold" Bienvenue Ici !>
<?php
$chaine="par moi";
echo "sur le site";
echo "fait $chaine"
?>
</body>
</html>

La regex doit sélectionner la 5ème et la 6ème ligne car les chaines définies entre double quote ne contienent pas de variable (caractère $). Il ne faut en revanche pas qu'elle selectionne la 3ème ligne qui n'est pas du php, ni la 7ème qui contient une variable.

J'ai essayer avec la commande egrep '<?php.*"[^$]*".*?>' mais cela ne fonctionne pas...

Merci
Configuration: Windows 7 Internet Explorer 8.0

3 réponses

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    [tmpfs]$ cat plop
    <html>
    <body>
    <p style="font-weight:bold" Bienvenue Ici !>
    <?php
    $chaine="par moi";
    echo "sur le site";
    echo "fait $chaine"
    ?>
    </body>
    </html>
    
    [tmpfs]$ sed '/^<?/,/^?>/{/".*\$.*"/!{s/"/'\''/g}}' plop
    <html>
    <body>
    <p style="font-weight:bold" Bienvenue Ici !>
    <?php
    $chaine='par moi';
    echo 'sur le site';
    echo "fait $chaine"
    ?>
    </body>
    </html>
    
    [tmpfs]$ 

    ;-))
    1
    1. Regexeur
       
      Merci bcp.
      et avec grep cela donne quoi ?
      0
    2. Haratryn
       
      grep -e "\".*.\"" <ton_fichier> | grep -v "$"

      pas tester donc pas sur que cela fonctionne.
      0
    3. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > Regexeur
       
      Re-

      grep n'est pas fait pour ça !
      0
    4. Regexeur > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
       
      Alors comment faire la recherche sans le remplacement dans un premier temps ? Il me sembler bien que c'était avec egrep...
      0
    5. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > Regexeur
       
      faire la recherche sans le remplacement dans un premier temps
      Ce qui change totalement le sens de ta demande initiale !

      La réponse t'a été donnée au message #6 par lami20j, mais je n'en vois pas trop l'utilité.
      0
  2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    Ce n'est qu'une solution pour ce cas concret
    lami20j@debian:~$ cat t.txt
    <html>
    <body>
    <p style="font-weight:bold" Bienvenue Ici !>
    <?php
    $chaine="par moi";
    echo "sur le site";
    echo "fait $chaine"
    ?>
    </body>
    </html>
    lami20j@debian:~$ grep -v '^[<?]' t.txt|egrep -o '"[^\$]*"'
    "par moi"
    "sur le site"

    0
  3. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Tiens essaie un truc comme ça :

    [tmpfs]$ ls
    foo.sh*   plop
    
    [tmpfs]$ cat plop
    <html>
    <body>
    <p style="font-weight:bold" Bienvenue Ici !>
    <?php
    $chaine="par moi";
    echo "sur le site";
    echo "fait $chaine"
    ?>
    </body>
    </html>
    
    [tmpfs]$ cat foo.sh
    #! /bin/sh
    
    #set -xv
    
    if [ "${#}" != "1" ]
    then
    echo "Usage : $0 fichier_à_traiter"
    exit
    fi
    
    fichier="$1"
    compteur="$(grep -v '^[<?]' ${fichier} |egrep -c '"[^\$]*"')"
    count=1
    OLD_VAR="§"
    
    while [ "${count}" -le "${compteur}" ]
    do
    VAR=$(grep -v '^[<?]' ${fichier} | grep -v "${OLD_VAR}" | egrep -m${count} '"[^\$]*"')
    
    echo "Voulez-vous remplacer la chaîne : " $VAR "? (O/N)"
    read reponse
    case "${reponse}" in
    O|o)    VAR_NEW=$(echo "${VAR}" | tr '"' "'")
            sed -i.bak${count} 's/'"$VAR"'/'"$VAR_NEW"'/' "${fichier}"
            (( count++ ))
            ;;
    N|n)    OLD_VAR="${VAR}"
            (( count++ ))
            ;;
    esac
    done
    
    [tmpfs]$ ./foo.sh plop
    Voulez-vous remplacer la chaîne :  $chaine="par moi"; ? (O/N)
    n
    Voulez-vous remplacer la chaîne :  echo "sur le site"; ? (O/N)
    o
    
    [tmpfs]$ cat plop
    <html>
    <body>
    <p style="font-weight:bold" Bienvenue Ici !>
    <?php
    $chaine="par moi";
    echo 'sur le site';
    echo "fait $chaine"
    ?>
    </body>
    </html>
    
    [tmpfs]$ ls
    foo.sh*  plop  plop.bak2
    
    [tmpfs]$ 

    ;-))
    0
    1. Regexeur
       
      Merci c'est exactement ce que je veux
      il y a malheuresement un bug:
      J'ai une chaine de ce type :
      define('PATH', "/toto")
      et sed renvoie l'erreur :
      sed option inconnue pour 's' : je pense que c'est lier au slash de la chaine
      0
      1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > Regexeur
         
        Remplace le délimiteur par défaut (le slash /) par un caractère dont tu es sûr qu'il ne se trouvera dans aucun motif...


        Voir la FAQ SED -Les délimiteurs
        0
      2. Regexeur > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
         
        ok c'est bon j'ai mis un "ŧ" : je ne pense pas l'utiliser celui là dans mes scripts php...

        Merci de votre aide
        0