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
元のファイルではなく一時ファイルで実行)、元のファイルのファイルメタデータ(権限と所有権)が変更されないことが保証されます。