bash + verificar nome por expressão regular

4

Por que a expressão regular a seguir imprime valid , quando o nome é hdpworker01 ?

name=hdpworker01
[[ $name =~ worker[[:digit:]] ]] && echo valid

O que eu tento fazer é imprimir valid apenas se o nome corresponder a worker[0-999] .

Exemplo de resultados esperados:

  • Para name=worker01 : valid
  • Para name=hdpworker01 : sem saída
por yael 09.07.2018 / 14:21

3 respostas

8

Por padrão, uma expressão regular não é ancorada no início ou no final de uma string. Isto é diferente de, e. padrões de globalização de nome de arquivo. Isso significa que a expressão pode corresponder em qualquer lugar na string dada.

Para ter sua expressão ancorada ao início da string, use

^worker[[:digit:]]

Para ancorá-lo adicionalmente ao final da string e para permitir de um a três dígitos, use

^worker[[:digit:]]{1,3}$

Se você deseja corresponder worker10 , mas não worker01 ou worker003 (sem números com zero), use

^worker([0-9]|[1-9][0-9]{1,2})$
    
por 09.07.2018 / 14:25
1

Ancore o regex dos dois lados.

^worker[[:digit:]]$
    
por 09.07.2018 / 14:24
1

why the following regular expression print valid , while name is hdpworker01

Por quê? Porque o regex não é ancorado , ou seja, ele não define o início (ou fim) da string que deve ser correspondida. O regex worker corresponderá se qualquer parte da string que estiver sendo correspondida for worker . Ele corresponderá a hdpworkeranything , bem como worker , como muitas outras variações. Para corresponder a uma string que comece com worker , faça a regex conter ^ , como:

^worker

Se você quiser corresponder (até) 3 dígitos após a palavra trabalhador, poderá usar:

^worker[0-9]{0,3}$

No entanto, será melhor capturar o número com parênteses e colocar o regex dentro de uma variável (usando uma variável é a melhor prática atual):

re='^worker([0-9]{0,3})$'

O $ significa que a string deve terminar nesse ponto.
A partida será:

[[ $str =~ $re ]] && n=$((10#${BASH_REMATCH[1]}+0)) || n=-1

what I try to do is to print valid only if name is worker[0-999]

E isso permitirá verificar o número n de intervalo:

(( 0 <= n && n <= 999 )) && echo "valid with n=$n"
    
por 10.07.2018 / 00:28