--in-place
私は視覚障害者ですか、それと同じオプションはありませんかsort
?
結果を入力ファイルに保存するには、sedは-i
(--in-place
)を使用します。
sort
出力を入力ファイルにリダイレクトする
sort < f > f
その結果、空になります。オプションがない場合--in-place
- これを行うためのいくつかのトリックがあるかもしれません。便利どのように?
(私の心の中に浮かぶ唯一のことは:
sort < f > /tmp/f$$ ; cat /tmp/f$$ > f ; rm /tmp/f$$
移動するのは正しい選択ではありません。ファイル権限変更されることがあります。そのため、一時ファイルの内容で上書きして削除します。 )
答え1
sort
ファイル名を引数として使用する-o
(または)オプションがあります。--output
プログラムはデータを一時ファイルに書き込み、ソートが完了した後に元の入力ファイルを上書きします(これはすべての入力データを読み取った後にのみ発生します)。 (これは本質的にdoneと同じですsed -i
。)
GNU sort
情報ページから:
-o OUTPUT-FILE
--output=OUTPUT-FILE
-
出力書き込み結果ファイル標準出力の代わりに。通常、
sort
開く前にすべての入力を読みます。結果ファイルsort -o F F
したがって、同じコマンドを使用してファイルを安全に並べ替えることができますcat F | sort -o F
。ただし、()をsort
使用すると、すべての入力を読み取る前に出力ファイルを開くことができるため、このコマンドは読み取りが完了する前に書き込みが開始されるため安全ではありません。--merge
-m
cat F | sort -m -o F - G
sort
F
cat
最新のシステムでは、設定されている場合は-o
入力ファイルの後に表示できません。たとえば、移植可能なスクリプトは入力ファイルの前に指定する必要があります。POSIXLY_CORRECT
sort F -o F
-o OUTPUT-FILE
-o output
-
標準出力の代わりに使用する出力ファイルの名前を指定します。このファイルは入力ファイルの1つと同じにすることができます。
sort
ディスク容量やディスククォータが不足したり、出力ファイルの書き込み中にシステムがクラッシュしたり、その他のエラーが発生した場合、sort
データの一部または全部が削除(破棄)される可能性があるという報告があります。
つまり、ファイルを所定の位置にソートするには、次のコマンドを使用できます。
sort -o filename filename
答え2
あなたはそれを使用することができますsponge
stdin
最初に浸してからファイルに書き込む関数です。たとえば、次のようになります。
sort < f | sponge f
欠点sponge
は、出力を一時的にメモリに保存するため、大容量ファイルの場合は問題になる可能性があることです。それ以外の場合は、最初にファイルに書き込んでから元のファイルを上書きする必要があります。
ただし、他の回答で指摘したように、内部修正は、プロセス(sponge
プロセスなど)中にコンピュータがクラッシュして元のファイルと新しいファイルの両方を失う可能性があるため、通常は良い考えではありません。まず、別のファイルに書き込み、次にアトム(移動)コマンドを使用することをお勧めしますmv
。
答え3
ファイルの書き込み中にプログラムまたはシステムがクラッシュすると両方が失われるため、入力ファイルを出力ファイルで上書きすることは危険です。
一部のプログラム(主にGNUバージョン)には内部オプションがあります(-i
PerlとGNU sed、-o
GNUソートなど)。それらがどのように機能するかは、データを一時ファイルに入れてからその場所に移動することです。
このオプションがないプログラムの場合、コリンワトソンのsponge
ユーティリティ(付属Joey Hessのmoreutils)は、すべてのプログラムに対してこの操作を自動的に実行します(例:cut
ファイルをその場で変更できますか?;iconvに入力ファイルを変換された出力に置き換えさせるにはどうすればよいですか?)。ただし、失敗してもdo_stuff | sponge myfile
空または無効な出力で常に上書きされます。パイプで接続されたコマンドが成功したかどうかを検出する方法はありません。したがって、一時ファイルを使用する場合に比べて入力は便利ですが、安全ではありません。myfile
do_stuff
sponge
同じ権限で元のファイルを再作成できないまれな場合にのみ、そのファイルを上書きすることをお勧めします。この場合、元の入力をどこかに保存することをお勧めします。その後、入力コピーを処理して元のファイルに送信できます。
cp -p f ~/f.backup
sort <~/f.backup >|f
rm ~/f.backup # optional
答え4
-o
vimメソッドを使用または試してください。
$ ex -s +'%!sort' -cxa file.txt