Estoy aprendiendo awk
y me gustaría saber si hay una opción para escribir cambios en el archivo, similar a sed
donde usaría la -i
opción para guardar modificaciones en un archivo.
Entiendo que podría usar la redirección para escribir cambios. Sin embargo, ¿hay alguna opción awk
para hacer eso?
Respuestas:
En la última versión de GNU Awk (desde la versión 4.1.0 ), tiene la opción de edición de archivos "in situ" :
Ejemplo de uso:
Para mantener la copia de seguridad:
fuente
inplace
en realidad es una biblioteca incluida degawk
acuerdo con la respuesta de iiSeymour , por lo queinplace
es algo que se puede incluir como unincludefile
.A menos que tenga GNU awk 4.1.0 o posterior ...
No tendrá una opción como la
-i
opción de sed, así que en su lugar:Nota:
-i
no es mágico, también está creando un archivo temporal quesed
solo lo maneja por usted.A partir de GNU awk 4.1.0 ...
GNU awk
agregó esta funcionalidad en la versión 4.1.0 (publicada el 10/05/2013) . No es tan sencillo como dar la-i
opción como se describe en las notas publicadas:Debe utilizar el
inplace.awk
archivo de inclusión incluido para invocar la extensión correctamente de la siguiente manera:La variable
INPLACE_SUFFIX
se puede usar para especificar la extensión de un archivo de respaldo:Estoy feliz esta característica se ha añadido pero para mí, la implementación no es muy awkish como el poder proviene de la concisión del lenguaje y
-i inplace
es de 8 caracteres demasiado tiempo imo .Aquí hay un enlace al manual para la palabra oficial.
fuente
awk '{ gsub(/foo/, "bar" ) } ; { print $0 }' file > tmp.txt && mv -v tmp.txt file
:?awk '{print $0}' file | sponge file
usandosponge
partirmoreutils
.@sudo_O tiene la respuesta correcta .
Esto no puede funcionar:
El shell realiza las redirecciones antes de pasar el control a algún proceso ( redirecciones ). La
>
redirección truncará el archivo a tamaño cero ( salida de redireccionamiento ). Por lo tanto, cuando se inicia algún proceso y desea leer el archivo, no hay datos para que lo lea.fuente
solo un pequeño truco que funciona
fuente
Una alternativa es usar
sponge
:Donde lo reemplaza
'{print $0}'
por su script awk yyour_file
por el nombre del archivo que desea editar en su lugar.sponge
absorbe completamente la entrada antes de guardarla en el archivo.fuente
sponge
es parte demoreutils
. Por lo tanto, no estará presente por defecto en la mayoría de los sistemas. Pero parece que al menos ensponge
sí mismo es lo suficientemente portátil y se puede ejecutar en casi todas partes.tee
basada en es quesponge
leerá todo en la RAM antes de escribir, por lo tanto, se congelará en archivos grandes.lo siguiente no funcionará
Esto debería funcionar
fuente
En caso de que desee una solución solo para awk sin crear un archivo temporal y que se pueda usar con version! = (Gawk 4.1.0):
fuente
Usando tee
el
tee
comando tiene lugar y se ejecuta después de que elawk
comando haya finalizado debido a|
.fuente