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?
command-line
text-processing
MsWanie
fuente
fuente

Respuestas:
Hay varias formas de hacerlo. Si su archivo tiene alguna estructura conocida, puede usarla
grep. Elgrepcomando busca en un archivo una frase específica y devuelve líneas que coinciden con esa frase. Entonces, si su archivo se ve asípuedes correr
grep Name info.txty volveráName: Sally. Luego puede redirigir la salida a otro archivo. Así llamandogrep Name info.txt > info2.txtenviará la línea al nuevo archivo info2.txt. Si desea agregar nuevas líneas, puede hacerlo
grep Address info.txt >> info2.txtde lo contrario, el archivo se sobrescribirá.
También podría aprender a usar un editor de texto de línea de comando como vim.
fuente
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:
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>.fuente
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.
fuente
Asumiendo que el archivo de entrada
details.txtcontiene:puede seleccionar las líneas "nombre" y "teléfono" mediante grep extendido y redirigir la salida a new.txt:
Esto producirá new.txt con:
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í.fuente
El archivo que mostró tiene todos los detalles en una línea:
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 :yphone number :, puede usar la-ebandera para especificar múltiples coincidencias o alternar.La expresión
[^ ]*significa cualquier número de caracteres que no son un espacio, por lo que coincide con los caracteres despuésage :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: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 decirlegrepque use expresiones regulares extendidas. La sintaxis es(pattern1|pattern2): esto coincidepattern1y / opattern2. 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.Si desea omitir las partes
age :yphone number:, puede usar el-Pindicador para solicitar elgrepuso 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:Si desea formatear el texto de manera diferente, puede usar
sed, por ejemplo:Esto depende de
agevenir antesphone 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: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 (GNUsedentiende-Econ el mismo significado)s/old/new/reemplazaroldconnew(pattern)guardapatternpara 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 quesedsolo contendrá hasta 7 de estos)..cualquier carácter, por lo tanto,.*representa cualquier número de caracteres.;separa los comandos, como en el shell.fuente