duas variáveis verificação padrão de uma só vez

0

É possível verificar se duas variáveis correspondem ao padrão regex de uma vez e não uma por uma? Veja como funciona agora:

# A=1.1
# B=1.2
# [[ $A =~ ^([0-9]+(\.([0-9]+(\.([0-9]+))?))?)$ && $B =~ ^([0-9]+(\.([0-9]+(\.([0-9]+))?))?)$ ]] && echo A:$A B$B
A:1.1 B1.2
# B=1.2.3
# [[ $A =~ ^([0-9]+(\.([0-9]+(\.([0-9]+))?))?)$ && $B =~ ^([0-9]+(\.([0-9]+(\.([0-9]+))?))?)$ ]] && echo A:$A B$B
A:1.1 B1.2.3
# B=1.2.3.4
# [[ $A =~ ^([0-9]+(\.([0-9]+(\.([0-9]+))?))?)$ && $B =~ ^([0-9]+(\.([0-9]+(\.([0-9]+))?))?)$ ]] && echo A:$A B$B
#

Gostaria de testar os dois de uma vez, como neste teste que não funciona:

# [[ ($A|$B) =~ ^([0-9]+(\.([0-9]+(\.([0-9]+))?))?)$ ]] && echo A:$A B$B
-bash: unexpected token '|', conditional binary operator expected
-bash: expected ')'
-bash: syntax error near '|$'
#
    
por DonJ 09.11.2017 / 15:55

2 respostas

2

Você não pode infelizmente fazer isso (assim). O lado esquerdo do operador =~ em bash é uma sequência (e provavelmente deve ser citado corretamente também). Se você quiser, pode obviamente criar uma expressão regular para combinar ambas as strings de uma vez (a concatenação das duas strings, ou algo assim), mas isso tornaria o código ainda mais difícil de ler e manter e você provavelmente não ganharia nenhum < em> velocidade dela (se é isso que você quer).

Além disso, quando você testar duas coisas com && intermediário, considere usar [[ ... ]] && [[ ... ]] em vez de [[ ... && ... ]] , para ser claro e claro sobre o que está incluído no lado direito do primeiro teste e o que compõe o lado esquerdo do segundo teste.

    
por 09.11.2017 / 16:16
0

Se houver um caractere que você sabe que não pode aparecer em uma correspondência bem-sucedida, você pode verificar a concatenação de $A e $B em relação a uma regex duplicada apropriada.

regex='([0-9]+(\.([0-9]+(\.([0-9]+))?))?)'

[[ "$A-$B" =~ ^$regex-$regex$ ]] && echo "A: $A B: $B"

Talvez seja necessário ajustar um pouco a expressão regular para compensar a falta de mais ^ e $ .

    
por 09.11.2017 / 17:19