O ~
é, na verdade, parte do operador =~
, que executa uma correspondência de expressão regular da sequência à sua esquerda para a expressão regular estendida à direita.
[[ "string" =~ pattern ]]
Observe que a string deve ser citada e que a expressão regular não deve ser citada.
Um operador similar é usado na linguagem de programação Perl.
As expressões regulares compreendidas por bash
são as mesmas que o GNU grep
entende com o -E
, ou seja, o conjunto estendido de expressões regulares.
Um pouco fora do assunto, mas é bom saber:
Ao corresponder a uma expressão regular contendo grupos de captura, a parte da string capturada por cada grupo está disponível na matriz BASH_REMATCH
. O zeroth / primeira entrada neste array corresponde a &
no padrão de substituição do comando de substituição sed
(ou $&
em Perl), que é o bit da string que corresponde ao padrão, enquanto as entradas em o índice 1 em diante corresponde a ,
, etc. em um padrão de substituição
sed
(ou $1
, $2
etc. em Perl), isto é, os bits correspondidos por cada parêntese.
Exemplo:
string=$( date +%T )
if [[ "$string" =~ ^([0-9][0-9]):([0-9][0-9]):([0-9][0-9])$ ]]; then
printf 'Got %s, %s and %s\n' \
"${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}"
fi
Isso pode produzir
Got 09, 19 and 14
se a hora atual for 09:19:14.
O REMATCH
do nome da matriz BASH_REMATCH
vem de "Correspondência de expressões regulares", ou seja, "RE-Match".
Em não- bash
shells parecidos com Bourne, também é possível usar expr
para correspondência de expressão regular limitada (usando apenas expressões regulares básicas).
Um pequeno exemplo:
$ string="hello 123 world"
$ expr "$string" : ".*[^0-9]\([0-9][0-9]*\)"
123