156

私は学んでおり、変更をファイルに保存するオプションを使用する場合awkと同様に、変更をファイルに書き込むオプションがあるかどうかを知りたいです。sed-i

リダイレクトを使用して変更を書き込むことができることは理解しています。しかし、それを行うオプションはありますawkか?

4

7 に答える 7

171

GNU Awk 4.1.0 (2013 年リリース) 以降では、「インプレース」ファイル編集のオプションがあります。

[...] 新しい機能を使用して構築された「インプレース」拡張機能は、GNU " sed -i" 機能をシミュレートするために使用できます。[...]

使用例:

$ gawk -i inplace '{ gsub(/foo/, "bar") }; { print }' file1 file2 file3

バックアップを保持するには:

$ gawk -i inplace -v INPLACE_SUFFIX=.bak '{ gsub(/foo/, "bar") }
> { print }' file1 file2 file3
于 2013-05-13T22:03:18.037 に答える
162

GNU awk 4.1.0 以降を使用していない限り...

sed の-iオプションのようなオプションはないため、代わりに次のようにします。

$ awk '{print $0}' file > tmp && mv tmp file

注:これ-iは魔法ではありません。一時ファイルを作成してsed処理するだけです。


GNU awk 4.1.0 以降...

GNU awkバージョン 4.1.0 (2013 年 10 月 5 日リリース)でこの機能を追加しました。-iリリースされたノートで説明されているように、オプションを指定するだけでは簡単ではありません。

新しい -i オプション (xgawk から) は、awk ライブラリ ファイルをロードするために使用されます。これは、最初の非オプション引数がスクリプトとして扱われるという点で -f とは異なります。

次のように、バンドルされたinplace.awkインクルード ファイルを使用して拡張機能を適切に呼び出す必要があります。

$ cat file
123 abc
456 def
789 hij

$ gawk -i inplace '{print $1}' file

$ cat file
123
456
789

変数INPLACE_SUFFIXを使用して、バックアップ ファイルの拡張子を指定できます。

$ gawk -i inplace -v INPLACE_SUFFIX=.bak '{print $1}' file

$ cat file
123
456
789

$ cat file.bak
123 abc
456 def
789 hij

-i inplaceこの機能が追加されたことをうれしく思いますが、私にとっては、言語の簡潔さに力があり、 8 文字が長すぎるため、実装はそれほど厄介ではありません。

公式ワードのマニュアルへのリンクはこちら。

于 2013-05-13T19:32:00.430 に答える
26

動作するほんの少しのハック

echo "$(awk '{awk code}' file)" > file
于 2015-10-07T15:01:53.037 に答える
17

@sudo_O has the right answer.

これは機能しません:

someprocess < file > file

シェルは、制御を someprocess に渡す前にリダイレクトを実行します ( redirections )。>リダイレクトにより、ファイルがゼロ サイズに切り捨てられます (出力のリダイレクト)。したがって、一部のプロセスが起動されてファイルからの読み取りが必要になるまでには、読み取るデータがありません。

于 2013-05-13T20:43:05.273 に答える
6

以下は動作しません

echo $(awk '{awk code}' file) > file

これはうまくいくはずです

echo "$(awk '{awk code}' file)" > file
于 2016-05-14T16:10:49.217 に答える
4

一時ファイルを作成せず、version!=(gawk 4.1.0) で使用可能な awk のみのソリューションが必要な場合:

awk '{a[b++]=$0} END {for(c=0;c<=b;c++)print a[c]>ARGV[1]}' file
于 2015-08-20T22:53:03.453 に答える