Estoy aprendiendo awky me gustaría saber si hay una opción para escribir cambios en el archivo, similar a seddonde usaría la -iopción para guardar modificaciones en un archivo.
Entiendo que podría usar la redirección para escribir cambios. Sin embargo, ¿hay alguna opción awkpara 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
inplaceen realidad es una biblioteca incluida degawkacuerdo con la respuesta de iiSeymour , por lo queinplacees 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
-iopción de sed, así que en su lugar:Nota:
-ino es mágico, también está creando un archivo temporal quesedsolo lo maneja por usted.A partir de GNU awk 4.1.0 ...
GNU awkagregó esta funcionalidad en la versión 4.1.0 (publicada el 10/05/2013) . No es tan sencillo como dar la-iopción como se describe en las notas publicadas:Debe utilizar el
inplace.awkarchivo de inclusión incluido para invocar la extensión correctamente de la siguiente manera:La variable
INPLACE_SUFFIXse 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 inplacees 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 fileusandospongepartirmoreutils.@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_filepor el nombre del archivo que desea editar en su lugar.spongeabsorbe completamente la entrada antes de guardarla en el archivo.fuente
spongees parte demoreutils. Por lo tanto, no estará presente por defecto en la mayoría de los sistemas. Pero parece que al menos enspongesí mismo es lo suficientemente portátil y se puede ejecutar en casi todas partes.teebasada en es quespongeleerá 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
teecomando tiene lugar y se ejecuta después de que elawkcomando haya finalizado debido a|.fuente