OVH Cloud OVH Cloud

shell, chaine et pattern

15 réponses
Avatar
FAb
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 ?
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

5 réponses

1 2
Avatar
FAb
Stephane Chazelas writes:

2007-01-03, 11:54(+01), FAb:
Stephane Chazelas writes:

Je pense garder :
[ -n "$A"-a -z "${A##*@*}"] && echo ßuper"
[...]


Ne pas utiliser "-a" ou "-o"! Utiliser && et || a la place.

$ A='=' bash -c '[ -n "$A" -a -z "${A##*@*}" ]'
bash: line 0: [: too many arguments
$ A='=' bash -c '[ -n "$A" ] && [ -z "${A##*@*}" ]'
$


Mouais.
Ça m'apprendra à voir faire le malin en y mettant ma patte.
Tssss.

Merci beaucoup.

FAb


Avatar
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 ?



Avatar
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




Avatar
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

Avatar
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

1 2