Extraia endereços separados por ponto e vírgula e imprima cada endereço em uma linha

Extraia endereços separados por ponto e vírgula e imprima cada endereço em uma linha

Eu tenho um arquivo com a seguinte entrada. Os números separados por pontos representam endereços. Qualquer número no endereço pode ter um ou mais dígitos da seguinte forma:

[112.112.112.112;3.3.3.3;44.44.44.44]
[6.6.6.6;17.17.17.17;88.88.88.88]

Quero extrair cada endereço sem ponto e vírgula e colchetes (os endereços são separados por ponto e vírgula ;) e inserir cada endereço em uma linha em um novo arquivo para produzir esta saída:

112.112.112.112
3.3.3.3
44.44.44.44
6.6.6.6
17.17.17.17
88.88.88.88

Como primeiro passo, tentei o grep para extrair os endereços da seguinte forma:

grep -E '\d+\.\d+\.\d+\.\d+' myfile.txt > newfile.txt

Mas não imprime nada.

Responder1

Regex estendido( -Eou egrep) não sabe \d. Use -Pconforme sugerido por @Alexander ou use -Ecom [0-9]ou [[:digit:]]em vez disso.

Adicione -opara selecionar apenas as correspondências em vez de linhas inteiras correspondentes. Isso também dividirá as partidas individuais em novas linhas.

grep -Eo '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' myfile.txt

ou

grep -Eo '[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+' myfile.txt

usandoRegex Perl( -Pou pgrep):

grep -Po '\d+\.\d+\.\d+\.\d+' myfile.txt

Se você mudar +para *você também pode usarRegex Básico:

grep -o '[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*' myfile.txt

Responder2

Substitua -Epor -Pe adicione -o:

 grep -P -o '\d+\.\d+\.\d+\.\d+' myfile.txt

Responder3

Usando awk:

awk 'NF' RS='[][;]' infile

Ou com trse você não se importa com a primeira linha vazia:

tr -s '];[' '\n' <infile

Responder4

grepé um exagero para esta tarefa. tré suficiente:

$ < input.txt tr -d '[]' | tr ';' '\n' | sort -u

A sort -uparte remove endereços duplicados.

informação relacionada