GNU awk(que se encuentra comúnmente en sistemas Linux), desde la versión 4.1.0, puede incluir una " awkbiblioteca fuente" con -io --includeen la línea de comando. Una de las bibliotecas de origen que se distribuye con GNU awkes una llamada inplace:
$ cat file
hello
there
$ awk -i inplace '/hello/ { print "oh,", $0 }' file
$ cat file
oh, hello
Como puede ver, esto hace que la salida del awkcódigo reemplace el archivo de entrada. La frase que dice thereno se guarda ya que el programa no la genera.
Con un awkscript en un archivo, lo usarías como
awk -i inplace -f script.awk datafile
Si la awkvariable INPLACE_SUFFIXse establece en una cadena, entonces la biblioteca haría una copia de seguridad del archivo original con eso como sufijo de nombre de archivo.
awk -i inplace -v INPLACE_SUFFIX=.bak -f script.awk datafile
Si tiene varios archivos de entrada, cada archivo se editará individualmente en el lugar. Pero puede desactivar la edición en el lugar para un archivo (o un conjunto de archivos) mediante el uso inplace=0de la línea de comando antes de ese archivo:
awk -i inplace -f script.awk file1 file2 inplace=0 file3 inplace=1 file4
En el comando anterior, file3no se editaría en el lugar.
Para una "edición local" más portátil de un solo archivo, use
tmpfile=$(mktemp)
cp file "$tmpfile" &&
awk '...some program here...' "$tmpfile" >file
rm "$tmpfile"
Esto copiaría el archivo de entrada a una ubicación temporal, luego aplicaría el awkcódigo en el archivo temporal mientras redirige al nombre de archivo original.
Hacer las operaciones en este orden (ejecutándose awken el archivo temporal, no en el archivo original) asegura que los metadatos del archivo (permisos y propiedad) del archivo original no se modifiquen.