¿Cómo copiar selectivamente los detalles de un archivo y pegarlos en un nuevo archivo?

11

Tengo un archivo que contiene mis datos personales (.txt). ¿Cómo puedo a través del terminal copiar solo algunos detalles del archivo y ponerlos en un nuevo .txtarchivo?

Por ejemplo, si este es el contenido del archivo:

name : farah age : 23 phone number : 0123 education : degree

¿Cómo puedo copiar solo la edad y el número de teléfono y enviarlos a un nuevo .txtarchivo?

MsWanie
fuente
2
Depende de lo que desee copiar en el nuevo archivo. ¿Desea las primeras líneas, las últimas líneas que contienen una cadena, que no contienen una cadena, líneas entre dos cadenas? Hay herramientas para hacer todo esto, pero necesitamos saber lo que desea hacer.
Arcege

Respuestas:

7

Hay varias formas de hacerlo. Si su archivo tiene alguna estructura conocida, puede usarla grep. El grepcomando busca en un archivo una frase específica y devuelve líneas que coinciden con esa frase. Entonces, si su archivo se ve así

Nombre: Sally

Fecha de nacimiento: 7.31.76

Dirección: 1234 Main St.

SSN: 123-45-6789

puedes correr grep Name info.txty volverá Name: Sally. Luego puede redirigir la salida a otro archivo. Así llamando

grep Name info.txt > info2.txt

enviará la línea al nuevo archivo info2.txt. Si desea agregar nuevas líneas, puede hacerlo

grep Address info.txt >> info2.txt

de lo contrario, el archivo se sobrescribirá.

También podría aprender a usar un editor de texto de línea de comando como vim.

Kris Harper
fuente
2

Puede usar grep para buscar una expresión regular en details.txt y redirigir el resultado al nuevo archivo.

Si todas las líneas que desea copiar tienen algo en común, las otras líneas no pueden usarlas:

grep "string in common" details.txt > new.txt

Si no es así, tendrá que buscar cada línea que desea copiar, aún usando grep, y los añade a nuevo.txt usando >>en lugar de >.

danjjl
fuente
1

También hay editores que trabajan en el terminal, por ejemplo, nano, vi y emacs.

Si está utilizando una interfaz gráfica de usuario en su máquina local y un terminal en una máquina remota, también puede usar el mouse para copiar y pegar desde una ventana / pestaña de terminal a una segunda.

elmicha
fuente
1

Asumiendo que el archivo de entrada details.txtcontiene:

name: farah
age: 23
phone number: 0123
education: degree

puede seleccionar las líneas "nombre" y "teléfono" mediante grep extendido y redirigir la salida a new.txt:

grep -E "age:|phone number:" details.txt > new.txt

Esto producirá new.txt con:

age: 23
phone number: 0123

Cómo funciona:

Grep imprime solo líneas coincidentes. Las -Eopciones permitieron regexp extendido que le da la posibilidad de usar |(alternativa). Recuerde citar todo el patrón, por |lo que será interpretado por grep. De lo contrario, Shell intentará interpretar. No quieres esto aquí.

Michał Šrajer
fuente
1

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.
Zanna
fuente