Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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. smile

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

Bousky a écrit :

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

sputnick a écrit :

[[ est aussi un programme externe

par rapport à quel shell ?

bash -c 'help [['
[[ ... ]]: [[ expression ]]
    Exécute une commande conditionnelle.

documentée dans le man. wink


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

sputnick a écrit :

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

Bousky a écrit :

« 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