El archivo que mostró tiene todos los detalles en una línea:
name : farah age : 23 phone number : 0123 education : degree
Supuse que puede codificar, age :
etc., en el comando, pero el texto que sigue variará y que los detalles pueden no estar en el orden dado o ser contiguos.
Puede extraer partes de la línea con grep
la -o
bandera de. Esto imprime solo la parte coincidente, en lugar de la línea completa.
Si desea incluir las partes age :
y phone number :
, puede usar la -e
bandera para especificar múltiples coincidencias o alternar.
$ grep -oe 'age : [^ ]*' -e 'phone number : [^ ]*' file
age : 23
phone number : 0123
La expresión [^ ]*
significa cualquier número de caracteres que no son un espacio, por lo que coincide con los caracteres después age :
del siguiente espacio.
Reemplace file
con el nombre del archivo que contiene sus detalles. Puede escribir el nuevo archivo redirigiendo la salida a un nuevo archivo con el >
operador, de esta manera:
grep -oe 'age : [^ ]*' -e 'phone number : [^ ]*' file > outfile
Cuando haces eso, no verás ningún resultado. Primero debe verificar la salida y luego agregar la redirección.
Aquí está el ejemplo con alternancia. Usamos la -E
bandera para decirle grep
que use expresiones regulares extendidas. La sintaxis es (pattern1|pattern2)
: esto coincide pattern1
y / o pattern2
. Si se encuentra alguno, se imprimirá (independientemente de si se encuentra el otro o no). Ahora estoy usando el +
significado de al menos uno de los caracteres anteriores, en lugar de *
significar cero o más del carácter anterior. En este contexto, ambos funcionan igualmente bien.
$ grep -Eo '(age : [^ ]+|phone number : [^ ]+)' file
age : 23
phone number : 0123
Si desea omitir las partes age :
y phone number:
, puede usar el -P
indicador para solicitar el grep
uso de expresiones regulares compatibles con Perl. Esto admite alternancia, y también una forma de hacer coincidir el texto después de un patrón dado:
$ grep -Po '(age : \K[^ ]+|phone number : \K[^ ]+)' file
23
0123
Si desea formatear el texto de manera diferente, puede usar sed
, por ejemplo:
$ sed -r 's/.*(age) : ([^ ]*).*(phone number) : ([^ ]*).*/\1:\2 | \3:\4/' file
age:23 | phone number:0123
Esto depende de age
venir antes phone number
, así que ajústelo en consecuencia si ese no es el caso. Si no puede confiar en el orden, puede usar este comando muy complicado:
$ sed -r 's/(.*)(phone number : [^ ]+)(.*) .*/\2 \1\4/; s/(phone number) : ([^ ]+) .*(age) : ([^ ]+).*/\1: \2 | \3: \4/' file
phone number: 0123 | age: 23
Esto reorganiza la línea para que la phone number :
sección aparezca primero en cada línea, luego realiza un segundo reemplazo para seleccionar los detalles deseados. Le debo la técnica utilizada aquí a esta respuesta de muru .
Notas sobre sed
comandos no cubiertos por explicaciones anteriores
-r
use expresiones regulares extendidas para comandos más legibles (GNU sed
entiende -E
con el mismo significado)
s/old/new/
reemplazar old
connew
(pattern)
guarda pattern
para referencia más adelante, con \1
o \2
etc. (correspondiente al orden de izquierda a derecha en el que se producen los grupos de captura; tenga en cuenta que sed
solo contendrá hasta 7 de estos).
.
cualquier carácter, por lo tanto, .*
representa cualquier número de caracteres.
;
separa los comandos, como en el shell.