私はブラインドですか、それともsort
に--in-place
のようなオプションはありませんか?
結果を入力ファイルに保存するために、sedは-i
(--in-place
)を使用します。
sort
の出力を入力ファイルにリダイレクトする
sort < f > f
空にします。 --in-place
オプションがない場合-便利なの方法でこれを行う方法がいくつかありますか?
(私の頭に浮かぶ唯一のもの:
sort < f > /tmp/f$$ ; cat /tmp/f$$ > f ; rm /tmp/f$$
移動は正しい選択ではありません。原因ファイルのアクセス権が変更される可能性があります。そのため、一時ファイルの内容で上書きしてから削除します。)
sort
には、ファイル名を引数として取る-o, --output
オプションがあります。入力ファイルと同じ場合は、結果を一時ファイルに書き込み、元の入力ファイルを上書きします(sed -i
とまったく同じです)。
GNU sort
情報ページから:
`-o OUTPUT-FILE'
`--output=OUTPUT-FILE'
Write output to OUTPUT-FILE instead of standard output. Normally,
`sort' reads all input before opening OUTPUT-FILE, so you can
safely sort a file in place by using commands like `sort -o F F'
and `cat F | sort -o F'. However, `sort' with `--merge' (`-m')
can open the output file before reading all input, so a command
like `cat F | sort -m -o F - G' is not safe as `sort' might start
writing `F' before `cat' is done reading it.
On newer systems, `-o' cannot appear after an input file if
`POSIXLY_CORRECT' is set, e.g., `sort F -o F'. Portable scripts
should specify `-o OUTPUT-FILE' before any input files.
および The Open Group Base Specifications Issue 7 :
-o output
Specify the name of an output file to be used instead of the standard
output. This file can be the same as one of the input files.
sponge
関数を使用できます。最初にstdin
をソークしてから、次のようにファイルに書き込みます。
sort < f | sponge f
sponge
の欠点は、出力を一時的にメモリに格納することです。これは、大きなファイルの場合に問題になる可能性があります。それ以外の場合は、まずファイルに書き込んでから、元のファイルを上書きする必要があります。
ただし、他の回答で指摘されているように、プロセスの途中(たとえば、sponge
の1つ)でマシンがクラッシュし、両方を失う可能性があるため、適切な変更は一般に良い考えではありません。元のファイルと新しいファイル。最初に別のファイルに書き込んでから、アトミックmv
(移動)命令を使用することをお勧めします。
入力ファイルを出力ファイルで上書きするのは危険です。ファイルの書き込み中にプログラムまたはシステムがクラッシュすると、両方が失われるためです。
いくつかのプログラム(主にGNUバージョン)にはインプレースオプションがあります(例:-i
PerlおよびGNU sed; -o
on GNU sort)。彼らはデータを一時ファイルに入れ、それを所定の場所に移動することによって機能します。そのようなオプションがないプログラムの場合、 Colin Watsonのsponge
ユーティリティ ( Joey Hessのmoreutils に含まれる)は、どのプログラムでも安全にジョブを実行します(例:- cut
でファイルをその場で変更できますか? ; iconvで入力ファイルを変換された出力に置き換える方法はありますか? )。
同じ権限で元のファイルを再作成できないまれな場合にのみ、ファイルを上書きすることをお勧めします。この場合、元の入力をどこかに保存することをお勧めします。そして、入力のコピーを処理して、元のファイルに送信するだけです。
cp -p f ~/f.backup
sort <~/f.backup >|f
rm ~/f.backup # optional
使用する -o
またはvim-wayを試してください:
$ ex -s +'%!sort' -cxa file.txt