Extraiga direcciones separadas por punto y coma e imprima cada dirección en una línea

Extraiga direcciones separadas por punto y coma e imprima cada dirección en una línea

Tengo un archivo con la siguiente entrada. Los números separados por puntos representan direcciones. Cualquier número en la dirección puede tener uno o más dígitos de la siguiente manera:

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

Quiero extraer cada dirección sin punto y coma ni corchetes (las direcciones están separadas por punto y coma ;) e insertar cada dirección en una línea en un nuevo archivo para producir este resultado:

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 primer paso, probé grep para extraer las direcciones de la siguiente manera:

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

Pero no imprime nada.

Respuesta1

expresión regular extendida( -Eo egrep) no sabe nada \d. Úselo -Pcomo lo sugiere @Alexander o úselo -Econ [0-9]o [[:digit:]]en su lugar.

Agregue -opara seleccionar solo las coincidencias en lugar de líneas coincidentes completas. Esto también dividirá las coincidencias individuales en nuevas líneas.

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

o

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

usandoexpresiones regulares de Perl( -Po pgrep):

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

Si cambias +a *también puedes usarExpresión regular básica:

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

Respuesta2

Reemplace -Econ -Py agregue -o:

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

Respuesta3

Usando awk:

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

O con trsi no te importa la primera línea vacía:

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

Respuesta4

grepes un poco excesivo para esta tarea. tres suficiente:

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

La sort -upieza elimina direcciones duplicadas.

información relacionada