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 et ses caprices (ou les miens) ✓ - Forum Linux / Unix
- Sed crlf - Astuces et Solutions
- 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é.