Expressions régulières avec egrep et sed

Résolu/Fermé
Regexeur - 6 nov. 2009 à 15:36
 Regexeur - 8 nov. 2009 à 20:30
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

3 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
6 nov. 2009 à 17:43
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
Merci bcp.
et avec grep cela donne quoi ?
0
grep -e "\".*.\"" <ton_fichier> | grep -v "$"

pas tester donc pas sur que cela fonctionne.
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897 > Regexeur
6 nov. 2009 à 23:14
Re-

grep n'est pas fait pour ça !
0
Regexeur > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
7 nov. 2009 à 00:04
Alors comment faire la recherche sans le remplacement dans un premier temps ? Il me sembler bien que c'était avec egrep...
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897 > Regexeur
7 nov. 2009 à 09:26
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
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
7 nov. 2009 à 00:13
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
7 nov. 2009 à 13:44
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
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897 > Regexeur
8 nov. 2009 à 17:01
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
Regexeur > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
8 nov. 2009 à 20:30
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