Je me demandais comment en shell on pouvait tester si une chaîne contenait un
caractère, voire un motif... Évidemment c'est facile, mais sans appel à une
commande externe ?
Sans commande externe, on peut utiliser le 'case'. Mais existe-t-il d'autres
façons de procéder ?
Genre un grigri du style $(mot/pattern/sub) ?
J'avoue que je sèche un peu en bash et que je ne suis pas une idole en zsh...
Bien cordialement et meilleurs voeux pour 2007
FAb
La notation ${foo%%pattern} enlève pattern à la fin de $foo. Du coup, si ${foo%%pattern} est la chaîne vide, c'est que foo matche pattern.
Ou que $foo est vide.
[ -z "$foo" ] && [ -n "${foo##*@*}" ]
Si mes souvenirs sont bons, [] est un alias pour l'invocation de la commande "test". Or Fab voulait justement eviter d'appeler un programme externe ?
Stephane Chazelas
2007-01-03, 14:41(+01), ALain Montfranc:
Stephane Chazelas a écrit
2007-01-03, 09:57(+00), Nicolas George:
Tu fais des lignes trop longues.
FAb wrote in message :
Genre un grigri du style $(mot/pattern/sub) ?
La notation ${foo%%pattern} enlève pattern à la fin de $foo. Du coup, si ${foo%%pattern} est la chaîne vide, c'est que foo matche pattern.
Ou que $foo est vide.
[ -z "$foo" ] && [ -n "${foo##*@*}" ]
Si mes souvenirs sont bons, [] est un alias pour l'invocation de la commande "test". Or Fab voulait justement eviter d'appeler un programme externe ? [...]
test, aka "[" est builtin dans tous les shells de type Bourne depuis des decennies.
-- Stéphane
2007-01-03, 14:41(+01), ALain Montfranc:
Stephane Chazelas a écrit
2007-01-03, 09:57(+00), Nicolas George:
Tu fais des lignes trop longues.
FAb wrote in message <m2bqlga0zy.fsf@aneto.localdomain>:
Genre un grigri du style $(mot/pattern/sub) ?
La notation ${foo%%pattern} enlève pattern à la fin de $foo. Du coup, si
${foo%%pattern} est la chaîne vide, c'est que foo matche pattern.
Ou que $foo est vide.
[ -z "$foo" ] && [ -n "${foo##*@*}" ]
Si mes souvenirs sont bons, [] est un alias pour l'invocation de la
commande "test". Or Fab voulait justement eviter d'appeler un programme
externe ?
[...]
test, aka "[" est builtin dans tous les shells de type Bourne
depuis des decennies.
La notation ${foo%%pattern} enlève pattern à la fin de $foo. Du coup, si ${foo%%pattern} est la chaîne vide, c'est que foo matche pattern.
Ou que $foo est vide.
[ -z "$foo" ] && [ -n "${foo##*@*}" ]
Si mes souvenirs sont bons, [] est un alias pour l'invocation de la commande "test". Or Fab voulait justement eviter d'appeler un programme externe ? [...]
test, aka "[" est builtin dans tous les shells de type Bourne depuis des decennies.
-- Stéphane
Ph. Ivaldi
Le 03 janvier 2007 à 10h54:57, FAb écrivit :
Bonjour,
Bonjour,
Je me demandais comment en shell on pouvait tester si une chaîne contenait un caractère, voire un motif... Évidemment c'est facile, mais sans appel à une commande externe ?
Sans commande externe, on peut utiliser le 'case'. Mais existe-t-il d'autres façons de procéder ?
Mes connaissances en script shell sont très limitées mais j'ai récemment vu passer ça (en Bash >= 3.0): if [[ "$foo" =~ "$REGEXP" ]]; then ... fi
[...] --
Philippe Ivaldi. http://home.tele2.fr/phivaldi/index.html
Le 03 janvier 2007 à 10h54:57,
FAb <g0up1l.at.yahoo.fr@yahoo.fr> écrivit :
Bonjour,
Bonjour,
Je me demandais comment en shell on pouvait tester si une chaîne
contenait un caractère, voire un motif... Évidemment c'est facile,
mais sans appel à une commande externe ?
Sans commande externe, on peut utiliser le 'case'. Mais existe-t-il
d'autres façons de procéder ?
Mes connaissances en script shell sont très limitées mais j'ai récemment
vu passer ça (en Bash >= 3.0):
if [[ "$foo" =~ "$REGEXP" ]]; then
...
fi
[...]
--
Philippe Ivaldi.
http://home.tele2.fr/phivaldi/index.html
Je me demandais comment en shell on pouvait tester si une chaîne contenait un caractère, voire un motif... Évidemment c'est facile, mais sans appel à une commande externe ?
Sans commande externe, on peut utiliser le 'case'. Mais existe-t-il d'autres façons de procéder ?
Mes connaissances en script shell sont très limitées mais j'ai récemment vu passer ça (en Bash >= 3.0): if [[ "$foo" =~ "$REGEXP" ]]; then ... fi
[...] --
Philippe Ivaldi. http://home.tele2.fr/phivaldi/index.html
Stephane Chazelas
2007-01-03, 16:26(+01), Ph Ivaldi:
Le 03 janvier 2007 à 10h54:57, FAb écrivit : [...]
Mes connaissances en script shell sont très limitées mais j'ai récemment vu passer ça (en Bash >= 3.0): if [[ "$foo" =~ "$REGEXP" ]]; then ... fi [...]
La, c'est bash specific (et il faut effectivement une version recente de bash). Les regexps en question sont des regexps etendues POSIX. Avec zsh, on a des perl-compatible regexps:
zmodload zsh/pcre [[ $foo -pcre-match $regexp ]]
Avec ksh93, regexp etendues AT&T:
[[ $foo = $(printf %P "$regexp") ]]
(ne marche pas si le dernier caractere du pattern est un saut de ligne comme dans regexp=$'n$')
Rien de portable ni de standard.
"expr" est builtin dans certaines versions de ash.
expr "x$foo" : "x$regexp" > /dev/null
expr est une commande standard. Attention, pour le ":" de expr, il y a un "^" explicit.
-- Stéphane
2007-01-03, 16:26(+01), Ph Ivaldi:
Le 03 janvier 2007 à 10h54:57,
FAb <g0up1l.at.yahoo.fr@yahoo.fr> écrivit :
[...]
Mes connaissances en script shell sont très limitées mais j'ai récemment
vu passer ça (en Bash >= 3.0):
if [[ "$foo" =~ "$REGEXP" ]]; then
...
fi
[...]
La, c'est bash specific (et il faut effectivement une version
recente de bash). Les regexps en question sont des regexps
etendues POSIX. Avec zsh, on a des perl-compatible regexps:
zmodload zsh/pcre
[[ $foo -pcre-match $regexp ]]
Avec ksh93, regexp etendues AT&T:
[[ $foo = $(printf %P "$regexp") ]]
(ne marche pas si le dernier caractere du pattern est un saut de
ligne comme dans regexp=$'n$')
Rien de portable ni de standard.
"expr" est builtin dans certaines versions de ash.
expr "x$foo" : "x$regexp" > /dev/null
expr est une commande standard. Attention, pour le ":" de expr,
il y a un "^" explicit.
Le 03 janvier 2007 à 10h54:57, FAb écrivit : [...]
Mes connaissances en script shell sont très limitées mais j'ai récemment vu passer ça (en Bash >= 3.0): if [[ "$foo" =~ "$REGEXP" ]]; then ... fi [...]
La, c'est bash specific (et il faut effectivement une version recente de bash). Les regexps en question sont des regexps etendues POSIX. Avec zsh, on a des perl-compatible regexps:
zmodload zsh/pcre [[ $foo -pcre-match $regexp ]]
Avec ksh93, regexp etendues AT&T:
[[ $foo = $(printf %P "$regexp") ]]
(ne marche pas si le dernier caractere du pattern est un saut de ligne comme dans regexp=$'n$')
Rien de portable ni de standard.
"expr" est builtin dans certaines versions de ash.
expr "x$foo" : "x$regexp" > /dev/null
expr est une commande standard. Attention, pour le ":" de expr, il y a un "^" explicit.