Je trouve souvent cela dans les scripts (et, je dois l'admettre, je l'écris moi-même):
a=$(echo "$x" | sed "s/foo/bar/")
ou
if echo "$x" | grep -q foo
then
...
fi
Considérez "foo" pour inclure des trucs regex.
Je pense qu'il devrait y avoir - et très probablement est - une meilleure façon de formuler ce, qui ne comporte pas deux commandes et un tuyau , mais enveloppe la chose dans une expression plus compacte.
Je ne le trouve pas. N'importe qui?
$()
plutôt que les raccourcis.a="$(echo "$x" | sed "s/foo/bar/")"
etif echo "$x" | grep foo; …
.Réponses:
À moins que vous ne supposiez un shell spécifique, il n'y a pas de meilleur moyen de le faire que de "faire écho à l'outil" (ou simplement un "outil" lui-même comme expr ); c'est tout ce sur quoi vous pouvez vraiment compter avec le shell Bourne traditionnel et / ou le shell POSIX . Si vous envisagez d'autres coquilles, il existe d'autres possibilités intégrées.
ksh a
?(pattern-list)
,*(pattern-list)
,{n}(pattern-list)
,{n,m}(pattern-list)
,@(pattern-list)
,!(pattern-list)
;%P
printf pour convertir une expression régulière étendue en motif (et%R
pour l'expression régulière étendue en motif);expr == pattern
état dans les[[ expr ]]
tests;${param/pattern/replacement}
expansion des paramètres.bash a
extglob
option d'activer la plupart des modèles supplémentaires de ksh (non{n}
et{n,m}
);expr == pattern
état (lors des[[ expr ]]
tests);${param/pattern/replacement}
expansion des paramètres;expr =~ extregexp
condition (dans les[[ expr ]]
tests) qui peut correspondre aux expressions régulières étenduesBASH_REMATCH
paramètre, des remplacements de style sed pourraient être effectués.zsh a
EXTENDED_GLOB
option;KSH_GLOB
option;expr == pattern
état (lors des[[ expr ]]
tests);${pattern/pattern/replacement}
expansion des paramètres;expr =~ extregexp
condition (dans les[[ expr ]]
tests) qui peut correspondre à des expressions régulières étendues,MATCH
paramètre et lematch
paramètre (ouBASH_REMATCH
avec l'BASH_REMATCH
ensemble d'options), des remplacements de style sed pourraient être effectués;zsh/pcre
module qui offrepcre_compile
,pcre_study
et lespcre_match
commandes et la condition de-pcre-match
test (dans les[[ expr ]]
tests);zsh/regex
module qui offre la condition de-regex-match
test (en[[ expr ]]
tests).la source
Pour remplacer la ligne sed, faites quelque chose comme
${a/foo/bar}
ou${a//foo/bar}
Dans le premier formulaire, seule la première instance est remplacée. Le deuxième formulaire est une recherche globale et remplacer.
Dans votre cas, ce serait
Au lieu de:
Pensez à utiliser:
Où
foo
est une expression régulière.la source
if [ $x =~ foo ]
donne un message d'erreur ici.if [[ $x =~ foo ]]
, cependant, fonctionne très bien. Merci!=~
nécessite bash> = 3 iirc.${a##foo}
et${a%%bar}
.=~
correspondance utilise des expressions régulières. C'est vrai, par exemple:[[ "abcdddde" =~ ^a.*d+.g* ]]
(c'est zéro ou plus de g plutôt que g-joker, par exemple).Un bon moyen compatible posix pour tester si une variable contient un motif est:
La syntaxe de l' expansion des paramètres est la suivante:
où
pattern
est un motif de coquille .la source