Algo como isso funciona aqui:
busybox grep -E '^\[(([0-9]{1,3}\.){3}[0-9]{1,3},)*([0-9]{1,3}\.){3}[0-9]{1,3}\]$'
(o busybox não é meu grep padrão, daí o prefixo "busybox").
Isso deve principalmente validar sua lista, embora não seja perfeita. Por exemplo, aceita 300.1.2.4
como um endereço IP válido. O regexp para totalmente validar que quatro números separados por pontos representam um endereço inicial de sub-rede válido seria muito mais complicado.
Para dividi-lo: primeiro, observe que parte dele é repetida. Chame esse I
por um segundo. Então, você pode ver que é ^\[(I,)*I\]$
, o que gera uma lista separada por vírgulas de I
s, com colchetes ao redor da lista inteira. Se você olhar o que é I
, é ([0-9]{1,3}\.){3}[0-9]{1,3}
, o que é mais simples se você notar outro padrão repetido, O = [0-9]{1,3}
. É então (O.){1,3}O
... quais são seus quatro octetos separados por decimal. Em um shell script, é claro que você pode usar variáveis para construir o padrão a partir desses blocos de construção mais simples - uma grande ajuda para a legibilidade e a facilidade de manutenção.
Eu testei com os seguintes dados de teste (com resultado esperado como comentário, não na verdade no arquivo de dados de teste):
1.2.3.4 # bad: no brackets
[1.2.3.4] # good
[1.2.3.44] # good
[1.2.3.4 # bad: missing bracket
1.2.3.4] # bad: missing bracket
[1.2.3.4,] # bad: empty item
[1.2.3.4,5.6.7.8] # good
[1.2.3.4,5.6.7.8,] # bad: empty item
[1.2.3.4,5.6.7.E] # bad: E is not a number
[1.2.3.4,,5.6.7.8] # bad: empty item
[1.2.3.1234] # bad: 1234 is more than 3 digits
edit: você pode usar O = ([0-9]{1,2}|[0-1][0-9]{2}|2[0-4][0-9]|25[0-5])
- pode haver uma maneira mais simples de escrever isso, não tenho certeza - para obter apenas números de 0 a 255; que leva a um padrão muito mais longo:
busybox grep -E '^\[((([0-9]{1,2}|[0-1][0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]{1,2}|[0-1][0-9]{2}|2[0-4][0-9]|25[0-5]),)*(([0-9]{1,2}|[0-1][0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]{1,2}|[0-1][0-9]{2}|2[0-4][0-9]|25[0-5])\]$'
... que pode ou não valer a pena, dependendo de como é importante validá-los totalmente.