#1 Le 25/08/2011, à 10:05
- Brownie03
comparer une phrase à une regex
Bonjour à tous !
Je suis en train de m'écrire un script Shell, et j'aurais besoin de tester si une chaîne de caractère (contenu dans une variable : $i) correspond ou non à une expression régulière.
J'ai vu de nombreuses solutions sur le net, mais je n'ai jamais réussi à aboutir ...
Comment déclare-t-on l'expression régulière ? Comment on la compare à notre chaîne de caractères ?
Pou illustrer ca, voula ou j'en suis (c'est un exemple) :
#!/bin/bash
i="il y a des PROBLEM partout"
test_regex_pb=`expr match "$i" '.*PROBLEM.*'`
if [ $test_regex_pb -eq 1 ]
then
echo "MATCH"
else
echo "No match"
fi
Cet exemple ne marche pas, je ne sais plus quoi essayer pour comparer des chaines de caractères par rapport à une expression régulière.
Si vous avez des pistes, des idées, je suis prenneur.
Cordialement.
Hors ligne
#2 Le 25/08/2011, à 11:27
- Bousky
Re : comparer une phrase à une regex
En bash il faut faire comme ça :
if [[ "$variable_a_tester" =~ regex ]]
Linux qui plante complètement ? Plus rien ne répond ? On peut toujours le redémarrer proprement :
Alt + SysRq + REISUB (Retourne En Islande Sur Un Bateau !)
Hors ligne
#3 Le 26/08/2011, à 09:04
- Brownie03
Re : comparer une phrase à une regex
Merci bien pour l'info.
Hors ligne
#4 Le 26/08/2011, à 16:59
- sputnick
Re : comparer une phrase à une regex
Une piste plus fiable et portable :
if echo "$var" | grep &>/dev/null "pattern"
Ou bien en bash :
grep &>/dev/null "pattern" <<< "$var"
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#5 Le 26/08/2011, à 19:09
- Bousky
Re : comparer une phrase à une regex
T'aurais pas inversé l'argument de grep et la redirection ? En plus pourquoi faire appel à un programme externe quand une primitive du shell fait la même chose, d'autant plus que la deuxième commande ne fonctionne justement que dans bash ?…
Linux qui plante complètement ? Plus rien ne répond ? On peut toujours le redémarrer proprement :
Alt + SysRq + REISUB (Retourne En Islande Sur Un Bateau !)
Hors ligne
#6 Le 26/08/2011, à 20:06
- sputnick
Re : comparer une phrase à une regex
T'aurais pas inversé l'argument de grep et la redirection ? En plus pourquoi faire appel à un programme externe quand une primitive du shell fait la même chose, d'autant plus que la deuxième commande ne fonctionne justement que dans bash ?…
Non je n'ai rien inversé, teste par toi même.
Faire usage de grep permet d'éviter d'utiliser des syntaxes exotiques quand la syntaxe des regex de grep est éprouvée. De plus on peut switcher entre ERE et BRE (extented regex et basic regex ) facilement avec grep
Je ne dit pas de ne pas utiliser =~ ça dépends des cas, a chacun de choisir.
Se documenter sur [[ dans man bash ( compound command ) :
LC_ALL=C man bash | less +/'\[\[.*compound'
http://wiki.bash-hackers.org/syntax/ccmd/intro chercher compound
Un exemple concret où grep fonctionne et pas =~
grep &>/dev/null '\<lm\>' /proc/cpuinfo && echo "archi hardware 64bit" || echo "archi hardware 32bit"
[[ $(awk '/flags/{print;exit}' /proc/cpuinfo) =~ '\<lm\>' ]] && echo "archi hardware 64bit" || echo "archi hardware 32bit" # resultat faux !
Encore un exemple, avec bash =~ on ne peut pas faire de positive-look ahead :
grep &>/dev/null -P "foo(?=bar)" <<< "foobar" && echo match || echo "dpesn't match"
Edit : effacé d'autant que [[ est aussi un programme externe ! (faux)
Dernière modification par sputnick (Le 26/08/2011, à 21:49)
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#7 Le 26/08/2011, à 20:25
- Watael
Re : comparer une phrase à une regex
[[ est aussi un programme externe
par rapport à quel shell ?
bash -c 'help [['
[[ ... ]]: [[ expression ]]
Exécute une commande conditionnelle.
documentée dans le man.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#8 Le 26/08/2011, à 20:48
- sputnick
Re : comparer une phrase à une regex
une commande n'est pas une primitive (built-in) du shell
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#9 Le 26/08/2011, à 20:52
- Bousky
Re : comparer une phrase à une regex
d'autant que [[ est aussi un programme externe !
$ type [[
[[ est un mot-clé du shell
$
Dernière modification par Bousky (Le 26/08/2011, à 20:52)
Linux qui plante complètement ? Plus rien ne répond ? On peut toujours le redémarrer proprement :
Alt + SysRq + REISUB (Retourne En Islande Sur Un Bateau !)
Hors ligne
#10 Le 26/08/2011, à 21:27
- sputnick
Re : comparer une phrase à une regex
[[ est aussi un programme externe
autant pour moi, c'est [ qui est une commande externe, [[ n'est pas un built-in mais un mot clef, si quelqu'un maîtrise la différence...
En Anglais "compound command" ca veut dire commande composé, d’où la confusion
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#11 Le 26/08/2011, à 21:42
- Bousky
Re : comparer une phrase à une regex
« mot-clé du shell », c'est juste la traduction de « shell builtin ».
En fait « [ » renvoi vers « /usr/bin/test » qui est un exécutable, mais bash (et sh) le surchargent avec une buitin.
Linux qui plante complètement ? Plus rien ne répond ? On peut toujours le redémarrer proprement :
Alt + SysRq + REISUB (Retourne En Islande Sur Un Bateau !)
Hors ligne
#12 Le 26/08/2011, à 21:45
- Watael
Re : comparer une phrase à une regex
[ est une commande externe, autant que echo, et d'autres sous /usr/bin, qui ont des homonymes parmi les builtins.
Si le chemin n'est pas stipulé, la builtin est utilisée.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#13 Le 26/08/2011, à 21:46
- sputnick
Re : comparer une phrase à une regex
« mot-clé du shell », c'est juste la traduction de « shell builtin ».
En fait « [ » renvoi vers « /usr/bin/test » qui est un exécutable, mais bash (et sh) le surchargent avec une buitin.
Sous archlinux, j'obtient 2 choses différentes :
sputnick@FreAkyLab:~$ type [
[ est une primitive du shell
sputnick@FreAkyLab:~$ type [[
[[ est un mot-clé du shell
en Anglais :
sputnick@FreAkyLab:~$ type [[
[[ is a shell keyword
sputnick@FreAkyLab:~$ type [
[ is a shell builtin
Donc en en ou en fr ce n'est pas la même chose
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#14 Le 26/08/2011, à 21:55
- Bousky
Re : comparer une phrase à une regex
Énéfé… au temps pour moi !
Un mot clef, c'est comme if, for, which, do, done, etc. Mais de là à connaître la différence de comportement entre [ et [[ …
Dernière modification par Bousky (Le 26/08/2011, à 22:02)
Linux qui plante complètement ? Plus rien ne répond ? On peut toujours le redémarrer proprement :
Alt + SysRq + REISUB (Retourne En Islande Sur Un Bateau !)
Hors ligne