Expressions régulières avec egrep et sed
Résolu
                                    
                        Regexeur                    
                                    -
                                     
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
                
            
                
    
    
    
        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
        A voir également:         
- Expressions régulières avec egrep et sed
- Remplacez le mot sed par le mot mais dans tout le texte. combien de caractères contient le document suite à cette modification (en incluant les espaces) ? - Guide
- Sed crlf - Astuces et Solutions
- Sed et ses caprices (ou les miens) ✓ - Forum Linux / Unix
- Sed - Remplacement texte par retour à la ligne ? ✓ - Forum Linux / Unix
- [PHP] : Expressions regulières - Forum PHP
3 réponses
                        
                    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]$ 
;-))
                        
                    Salut,
Ce n'est qu'une solution pour ce cas concret
                
                
    
                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"
                        
                    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]$ 
;-))
    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
    
    Voir la FAQ SED -Les délimiteurs
 
    
    
    
    
et avec grep cela donne quoi ?
pas tester donc pas sur que cela fonctionne.
grep n'est pas fait pour ça !
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é.