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

3

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 maneira:

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

Eu quero extrair cada endereço sem ponto-e-vírgula e parênteses (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 essa 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 extrair os endereços da seguinte forma:

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

Mas isso não imprime nada.

    
por user9371654 27.08.2018 / 11:26

4 respostas

5

Regex estendido ( -E ou egrep ) não sabe sobre \d . Use -P como sugerido por @Alexander ou use -E com [0-9] ou [[:digit:]] .

Adicione -o para selecionar as correspondências apenas em vez de linhas inteiras correspondentes. Isso também dividirá as correspondências únicas em novas linhas.

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

ou

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

usando Perl Regex ( -P ou pgrep ):

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

Se você alterar + para * , também poderá usar Regex básico :

grep -o '[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*' myfile.txt
    
por 27.08.2018 / 11:33
3

Substitua -E por -P e adicione -o :

 grep -P -o '\d+\.\d+\.\d+\.\d+' myfile.txt
    
por 27.08.2018 / 11:30
2

Usando awk :

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

Ou com tr se você não se importar com a primeira linha vazia:

tr -s '];[' '\n' <infile
    
por 27.08.2018 / 11:30
0

grep é um pouco exagerado para essa tarefa. tr é suficiente:

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

A parte sort -u remove endereços duplicados.

    
por 27.08.2018 / 20:50