Costumo encontrar isso em scripts (e, devo admitir, escrevo eu mesmo):
a=$(echo "$x" | sed "s/foo/bar/")
ou
if echo "$x" | grep -q foo
then
...
fi
Considere "foo" para incluir algumas coisas de expressões regulares.
Eu sinto que deveria haver - e provavelmente existe - uma maneira melhor de expressar isso, uma que não envolva dois comandos e um cachimbo, mas envolva a coisa em uma expressão mais compacta.
Eu simplesmente não consigo encontrá-lo. Qualquer pessoa?
$()
backticks.a="$(echo "$x" | sed "s/foo/bar/")"
eif echo "$x" | grep foo; …
.Respostas:
A menos que você assuma um shell específico, não há maneira melhor de fazer isso do que "eco de tubo para ferramenta" (ou apenas uma "ferramenta" como expr ); é tudo o que você pode contar com o tradicional shell Bourne e / ou o POSIX . Se você considerar outras conchas, existem outras possibilidades integradas.
ksh tem
?(pattern-list)
,*(pattern-list)
,{n}(pattern-list)
,{n,m}(pattern-list)
,@(pattern-list)
,!(pattern-list)
,%P
printf para converter uma expressão regular estendida em um padrão (e%R
para expressão regular estendida em padrão);expr == pattern
condição em[[ expr ]]
testes;${param/pattern/replacement}
expansão do parâmetro.bash tem
extglob
opção de habilitar a maioria dos padrões extras do ksh (no{n}
e{n,m}
);expr == pattern
condição (em[[ expr ]]
testes);${param/pattern/replacement}
expansão do parâmetro;expr =~ extregexp
condição (nos[[ expr ]]
testes) que pode corresponder às expressões regulares estendidasBASH_REMATCH
parâmetro, substituições no estilo sed podem ser feitas.zsh tem
EXTENDED_GLOB
opção;KSH_GLOB
opção;expr == pattern
condição (em[[ expr ]]
testes);${pattern/pattern/replacement}
expansão do parâmetro;expr =~ extregexp
condição (em[[ expr ]]
testes) que pode corresponder a expressões regulares estendidas,MATCH
parâmetro e omatch
parâmetro (ouBASH_REMATCH
com oBASH_REMATCH
conjunto de opções), podem ser feitas substituições no estilo sed ;zsh/pcre
módulo que ofertaspcre_compile
,pcre_study
, epcre_match
comandos e o-pcre-match
teste de condição (em[[ expr ]]
testes);zsh/regex
módulo que oferece a condição de-regex-match
teste (em[[ expr ]]
testes).fonte
Para substituir a linha sed, faça algo como
${a/foo/bar}
ou${a//foo/bar}
Na primeira forma, apenas a primeira instância é substituída. O segundo formulário é uma pesquisa e substituição global.
No seu caso, seria
Ao invés de:
Considere usar:
Onde
foo
está uma expressão regular.fonte
if [ $x =~ foo ]
dá uma mensagem de erro aqui.if [[ $x =~ foo ]]
, no entanto, funciona muito bem. Obrigado!=~
requer bash> = 3 iirc.${a##foo}
e${a%%bar}
.=~
usa expressões regulares. Isso é verdade, por exemplo:[[ "abcdddde" =~ ^a.*d+.g* ]]
(isso é zero ou mais gs em vez de g-curinga, por exemplo).Uma boa maneira compatível com posix para testar se uma variável contém um padrão é:
A sintaxe da expansão do parâmetro é:
Onde
pattern
é um padrão de concha .fonte