GNU awk
(comunemente presente sui sistemi Linux), dalla versione 4.1.0, è in grado di includere una " awk
libreria sorgente" con -i
o --include
sulla 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 awk
codice sostituisca il file di input. La frase dicendo there
non viene mantenuta in quanto non viene emessa dal programma.
Con uno awk
script in un file, lo useresti come
awk -i inplace -f script.awk datafile
Se la awk
variabile 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=0
dalla riga di comando prima di quel file:
awk -i inplace -f script.awk file1 file2 inplace=0 file3 inplace=1 file4
Nel comando sopra, file3
non 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 awk
codice sul file temporaneo durante il reindirizzamento al nome file originale.
L'esecuzione delle operazioni in questo ordine (in esecuzione awk
sul file temporaneo, non sul file originale) garantisce che i metadati (autorizzazioni e proprietà) del file originale non vengano modificati.