¿Cómo editar programáticamente un archivo usando solo terminal?

13

Deseo escribir un script de shell mediante el cual pueda leer el archivo desde el comando y editar el archivo sin intervención manual (basado en buscar un texto y reemplazarlo por otro).

No necesito usar ningún editor de texto para esto ... simplemente buscar texto (como usar grep) y luego reemplazarlo con otro texto y guardar los cambios ...

Rohit Bansal
fuente

Respuestas:

10

Ahí es donde sedentra a jugar. Un sedcomando tiene este formato:

[pattern1][,pattern2][!] command [args]

Utiliza expresiones regulares, por lo que puede / será un poco difícil. Algunos ejemplos básicos tomados del segundo enlace a continuación:

# sustituir (buscar y reemplazar) "foo" con "barra" en cada línea
sed 's / foo / bar /' # reemplaza solo la primera instancia en una línea
sed 's / foo / bar / 4' # reemplaza solo la 4ta instancia en una línea
sed 's / foo / bar / g' # reemplaza TODAS las instancias en una línea
sed 's / \ (. * \) foo \ (. * foo \) / \ 1bar \ 2 /' # reemplaza el penúltimo caso
sed 's / \ (. * \) foo / \ 1bar /' # reemplaza solo el último caso

# sustituya "foo" con "bar" SOLAMENTE por líneas que contengan "baz"
sed '/ baz / s / foo / bar / g'

# sustituya "foo" por "bar" EXCEPTO por líneas que contengan "baz"
sed '/ baz /! s / foo / bar / g'

# cambia "escarlata" o "rubí" o "puce" a "rojo"
sed 's / scarlet / red / g; s / ruby ​​/ red / g; s / puce / red / g' # más seds
gsed 's / scarlet \ | ruby ​​\ | puce / red / g' # GNU sed solo

Algunas referencias

Rinzwind
fuente
7

Muy tarde respuesta. Sin embargo, esto podría ayudar a otros con un problema / pregunta similar.

Recomendaría crear y aplicar un parche. Un buen ejemplo se puede encontrar aquí .

Por ejemplo, suponiendo que un archivo new.txt contiene cambios que desea aplicar a old.txt. Puede ejecutar los comandos en un terminal o creando y ejecutando patch_file.sh.

Línea de comando: abra una terminal y copie y ejecute las siguientes líneas (cambie los nombres de los archivos según sea necesario):

diff old.txt new.txt > patch.patch # to create the patch
patch old.txt -i patch.patch -o patched_old.text # to apply patch

Script: utilizando un enfoque de archivo .sh. En una terminal (teclado: ctrl + alt + t: gedit patch_file.sh

Copie y pegue los comandos que irían en la terminal, al archivo .sh y debajo del encabezado como se muestra a continuación (gedit).

#!/bin/sh
diff old.txt new.txt > patch.patch # to create the patch
patch old.txt -i patch.patch -o patched_old.text # to apply patch

Hacer el script ejecutable (terminal):

chmod +x patch_file.sh

Ejecute el script (terminal):

./patch_file.sh # may require sudo access depending on the directory affected
usuario3832905
fuente
El parche +1 es siempre el camino directo para modificaciones medias a pesadas o complejas. No sé por qué algunos intentan hacer todo usando herramientas de expresiones regulares.
user.dz
+1 es mucho mejor que la ingeniería inversa de una expresión regular que parece aplicar el cambio que desea en el archivo con el que prueba ... pero cuando se aplica a otras instancias de ese archivo a veces tiene otros efectos.
bigjosh
¿Tiene sentido un parche si deseo reemplazar todas las instancias de cadenas de texto específicas, es decir, reemplazar todas "" con "_", todas "menos" con "-" y todas "gb | <string_of_numbers> | ARO:" con " ARO: "? Gracias.
Josh
1

Si desea editar un archivo, use un editor de archivos, hay editores de archivos basados ​​en comandos que pueden usarse desde scripts, como ex o ed .

geirha
fuente
1

Estás buscando sed o awk. Creo que sed es más simple y awk es más poderoso.

Aquí hay un ejemplo de otra pregunta .

sed -i 's/gedit.desktop/yournew.desktop/g' /usr/share/applications/defaults.list

Esto significa:

  • buscar en el archivo /usr/share/applications/defaults.list
  • Encontrar / grep gedit.desktop
  • Reemplazar con yournew.desktop
  • Aplicar los cambios en su lugar -i
RobotHumanos
fuente
0

Dependiendo de lo que necesite editar, si está familiarizado vi, edpuede ser útil.

Glenn Jackman
fuente