Bash check reg expresion uma ou mais vezes

0

Eu quero verificar se a variável 'X' está na seguinte parttern [a-zA-Z0-9]+:[0-9]+:[0-9]+ , eu verifico com if [[ "${X}" =~ [a-zA-Z0-9]+:[0-9]+:[0-9]+ ]]

Agora eu quero adicionar e opção que este padrão possa ser inserido mais de um e neste caso ele será separado por , . Eu acho que posso algo como [a-zA-Z0-9]+:[0-9]+:[0-9]+[,[a-zA-Z0-9]+:[0-9]+:[0-9]+]* . Minha pergunta é se eu posso fazer isso mais curto então?

    
por Nir 28.10.2018 / 14:36

1 resposta

1

Você deseja ^[a-zA-Z0-9]+:[0-9]+:[0-9]+(,[a-zA-Z0-9]+:[0-9]+:[0-9]+)*$ , com parênteses em vez de colchetes na parte (,...)* e com o padrão bloqueado para o início e o fim da sequência (caso contrário, é suficiente corresponder a uma parte da sequência).

Uma opção é deixar o regex assim, mas apenas armazenar a parte repetitiva em uma variável:

p='[a-zA-Z0-9]+:[0-9]+:[0-9]+'
s='foo:12:34,bar:56:78'
[[ $s =~ ^$p(,$p)*$ ]] && echo yes

Ou coloque uma vírgula principal no valor e altere o RE para (,[a-zA-Z0-9]+:[0-9]+:[0-9]+)+ :

q='^(,[a-zA-Z0-9]+:[0-9]+:[0-9]+)+$'
[[ ,$s =~ $q ]] && echo yes

No entanto, se você for processar os valores na lista do script, precisará dividi-lo em partes, mais cedo ou mais tarde. Assim, basta dividir primeiro e testar cada parte separadamente:

s='adsf,bar:56:78'
p='^[a-zA-Z0-9]+:[0-9]+:[0-9]+$'
IFS=, read -a a <<< "$s"
for x in "${a[@]}"; do 
    if [[ $x =~ $p ]]; then 
        echo "$x is ok";
    else 
        echo "$x is not ok"; 
    fi
done
    
por 28.10.2018 / 14:55