GNU awk(一般にLinuxシステムで見られる)は、バージョン4.1.0以降、「awkソースライブラリ」をコマンドラインとともに、-iまたは--includeコマンドラインに含めることができます。GNUと一緒に配布されたソースライブラリの一つがawk呼ばれるものですinplace。
$ cat file
hello
there
$ awk -i inplace '/hello/ { print "oh,", $0 }' file
$ cat file
oh, hello
ご覧のとおり、これによりawkコードの出力が入力ファイルに置き換わります。thereプログラムから出力されないため、セリフは保持されません。
でawk、ファイル内のスクリプト、あなたはそれが好きで使用します
awk -i inplace -f script.awk datafile
場合はawk、変数をINPLACE_SUFFIX文字列に設定され、その後、ライブラリはファイル名の接尾辞としてそれと元のファイルのバックアップを作成します。
awk -i inplace -v INPLACE_SUFFIX=.bak -f script.awk datafile
複数の入力ファイルがある場合は、各ファイルを個別にインプレース編集できます。ただし、ファイル(またはファイルのセット)のインプレース編集をオフにするinplace=0には、そのファイルの前のコマンドラインで次のように使用します。
awk -i inplace -f script.awk file1 file2 inplace=0 file3 inplace=1 file4
上記のコマンドでfile3は、インプレースで編集されません。
単一のファイルのよりポータブルな「インプレース編集」を行うには、
tmpfile=$(mktemp)
cp file "$tmpfile" &&
awk '...some program here...' "$tmpfile" >file
rm "$tmpfile"
これにより、入力ファイルが一時的な場所にコピーさawkれ、一時ファイルにコードが適用され、元のファイル名にリダイレクトされます。
この順序で操作を実行すると(awk元のファイルではなく一時ファイルで実行)、元のファイルのファイルメタデータ(権限と所有権)が変更されないことが保証されます。