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 .txt
archivo?
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 .txt
archivo?
command-line
text-processing
MsWanie
fuente
fuente
Respuestas:
Hay varias formas de hacerlo. Si su archivo tiene alguna estructura conocida, puede usarla
grep
. Elgrep
comando 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.txt
y volveráName: Sally
. Luego puede redirigir la salida a otro archivo. Así llamandogrep 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.
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.txt
contiene: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
-E
opciones 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
grep
la-o
bandera 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-e
bandera 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
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: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 decirlegrep
que use expresiones regulares extendidas. La sintaxis es(pattern1|pattern2)
: esto coincidepattern1
y / 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-P
indicador para solicitar elgrep
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:Si desea formatear el texto de manera diferente, puede usar
sed
, por ejemplo:Esto depende de
age
venir 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
sed
comandos no cubiertos por explicaciones anteriores-r
use expresiones regulares extendidas para comandos más legibles (GNUsed
entiende-E
con el mismo significado)s/old/new/
reemplazarold
connew
(pattern)
guardapattern
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 quesed
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.fuente