
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( -E
o egrep
) no sabe nada \d
. Úselo -P
como lo sugiere @Alexander o úselo -E
con [0-9]
o [[:digit:]]
en su lugar.
Agregue -o
para 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( -P
o 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 -E
con -P
y agregue -o
:
grep -P -o '\d+\.\d+\.\d+\.\d+' myfile.txt
Respuesta3
Usando awk
:
awk 'NF' RS='[][;]' infile
O con tr
si no te importa la primera línea vacía:
tr -s '];[' '\n' <infile
Respuesta4
grep
es un poco excesivo para esta tarea. tr
es suficiente:
$ < input.txt tr -d '[]' | tr ';' '\n' | sort -u
La sort -u
pieza elimina direcciones duplicadas.