GNU awk(comunemente presente sui sistemi Linux), dalla versione 4.1.0, è in grado di includere una " awklibreria sorgente" con -io --includesulla riga di comando. Una delle librerie di origine distribuite con GNU awkè una chiamata inplace:
$ cat file
hello
there
$ awk -i inplace '/hello/ { print "oh,", $0 }' file
$ cat file
oh, hello
Come puoi vedere, questo fa sì che l'output del awkcodice sostituisca il file di input. La frase dicendo therenon viene mantenuta in quanto non viene emessa dal programma.
Con uno awkscript in un file, lo useresti come
awk -i inplace -f script.awk datafile
Se la awkvariabile INPLACE_SUFFIXè impostata su una stringa, la libreria eseguirà un backup del file originale con quello come suffisso del nome file.
awk -i inplace -v INPLACE_SUFFIX=.bak -f script.awk datafile
Se si dispone di più file di input, ogni file deve essere modificato individualmente sul posto. Ma puoi disattivare la modifica sul posto per un file (o un set di file) utilizzando inplace=0dalla riga di comando prima di quel file:
awk -i inplace -f script.awk file1 file2 inplace=0 file3 inplace=1 file4
Nel comando sopra, file3non verrebbe modificato sul posto.
Per una "modifica sul posto" più portatile di un singolo file, utilizzare
tmpfile=$(mktemp)
cp file "$tmpfile" &&
awk '...some program here...' "$tmpfile" >file
rm "$tmpfile"
Ciò copierebbe il file di input in un percorso temporaneo, quindi applicherebbe il awkcodice sul file temporaneo durante il reindirizzamento al nome file originale.
L'esecuzione delle operazioni in questo ordine (in esecuzione awksul file temporaneo, non sul file originale) garantisce che i metadati (autorizzazioni e proprietà) del file originale non vengano modificati.