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 grepla -obandera 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 -ebandera 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 filecon 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 -Ebandera para decirle grepque use expresiones regulares extendidas. La sintaxis es (pattern1|pattern2): esto coincide pattern1y / 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 -Pindicador para solicitar el grepuso 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 agevenir 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 sedcomandos no cubiertos por explicaciones anteriores
-ruse expresiones regulares extendidas para comandos más legibles (GNU sedentiende -Econ el mismo significado)
s/old/new/reemplazar oldconnew
(pattern)guarda patternpara referencia más adelante, con \1o \2etc. (correspondiente al orden de izquierda a derecha en el que se producen los grupos de captura; tenga en cuenta que sedsolo contendrá hasta 7 de estos).
.cualquier carácter, por lo tanto, .*representa cualquier número de caracteres.
; separa los comandos, como en el shell.