2012-02-29 23 views
6

Estoy tratando de hacer una sustitución de una sola línea en un archivo con awk, por ejemplocambiar una línea con awk

cambiar esto:

e1 is (on) 

e2 is (off) 

a:

e1 is (on) 

e2 is (on) 

uso comando:

awk '/e2/{gsub(/off/, "on")};{print}' ~/Documents/Prueba > ~/Documents/Prueba 

esto hace la sustitución pero el archivo termina en blanco!

Respuesta

18

Otra respuesta, usando una herramienta diferente (sed, y el -i (en su lugar) flag)

sed -i '/e2/ s/off/on/' ~/Documents/Prueba 
17

Tu awk es correcto, sin embargo, estás redireccionando al mismo archivo que tu original. Esto está causando que el archivo original se sobrescriba antes de que se haya leído. Tendrá que redirigir el resultado a un archivo diferente.

awk '/e2/{gsub(/off/, "on")};{print}' ~/Documents/Prueba > ~/Documents/Prueba.new 

Renombrar Prueba.new después si es necesario.

+2

+1. Énfasis en "el archivo original [se sobrescribe] antes * de que se haya leído" –

0

No puede redireccionar al mismo archivo como archivo de entrada. Eligió otro nombre de archivo.

El > vaciará su archivo en primer lugar.

2

También puede utilizar cat para leer el archivo en primer lugar, a continuación, utilizar pipe para redirigir la salida estándar, entonces leído con awk de la entrada estándar:

cat ~/Documents/Prueba | awk '/e2/{gsub(/off/, "on")};{print}' - > ~/Documents/Prueba 

creo que el guión - es opcional, ya que sólo está leyendo la entrada estándar.

Parte de la documentación interesante: https://www.gnu.org/software/gawk/manual/html_node/Naming-Standard-Input.html

2

Como se explica por las otras respuestas y en la pregunta "Why reading and writing the same file through I/O redirection results in an empty file in Unix?", los cambios de dirección de concha destruir el archivo de entrada antes de que se lee.

Para resolver ese problema sin recurrir explícitamente a archivos temporales, eche un vistazo al comando sponge de la colección moreutils.

awk '/e2/{gsub(/off/, "on")};{print}' ~/Documents/Prueba | sponge ~/Documents/Prueba 

Alternativamente, si GNU awk está instalado en el sistema, puede utilizar la in place extension.

gawk -i inplace '/e2/{gsub(/off/, "on")};{print}' ~/Documents/Prueba 
Cuestiones relacionadas