GNU/Linux >> Linux の 問題 >  >> Linux

awkを使用してファイルをインプレースで変更するには? (sed -i と同様)

GNU awk (Linux システムでよく見られる) バージョン 4.1.0 以降、"awk ソースライブラリ" -i または --include コマンドラインで。 GNU awk で配布されているソース ライブラリの 1 つ 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 を実行します) 元のファイルではなく、一時ファイルに) を追加すると、元のファイルのファイル メタデータ (アクセス許可と所有権) が変更されないことが保証されます。


これを試してください。

awk  new.awk sample.csv > tmp.csv && mv -f tmp.csv sample.csv
  • 出力を一時ファイルにリダイレクトします。
  • 次に、一時ファイルの内容を元のファイルに移動します。

Linux
  1. sed のようなテキストを python に置き換えるにはどうすればよいですか?

  2. sed を使用してファイルの 1 行目にテキストを挿入するにはどうすればよいですか?

  3. ddを使用してFFでファイルをパディングする方法は?

  1. .htaccessファイルのmemory_limitを変更する方法

  2. SFTP サーバーが使用しているエンコーディングを変更するにはどうすればよいですか?

  3. rm を使わずにファイルを削除するには?

  1. ファイル内の文字列を置き換える方法は?

  2. Sed -i(インプレース編集)で移植性を実現するにはどうすればよいですか?

  3. パイプでティーを使用しているときにstderrをファイルに書き込むにはどうすればよいですか?