回答:
そのコマンドの後にfile.txtが空である理由は、シェルが処理を行う順序です。その行で最初に発生するのはリダイレクトです。ファイル「file.txt」が開かれ、0バイトに切り捨てられます。その後、sedコマンドが実行されますが、その時点でファイルはすでに空です。
いくつかのオプションがあり、ほとんどは一時ファイルへの書き込みを伴います。
sed '1d' file.txt > tmpfile; mv tmpfile file.txt # POSIX
sed -i '1d' file.txt # GNU sed only, creates a temporary file
perl -ip -e '$_ = undef if $. == 1' file.txt # also creates a temporary file
ed
。
ed
コマンドは次のようになりますprintf "%s\n" 1d w q | ed file.txt
(Iハート編)
-exec sed -i '1d' {} \;
代替の非常に軽量なオプションは、最初の行以外をすべて「テール」にすることです(これは、一般的にファイルヘッダーを削除する簡単な方法です)。
# -n +2 : start at line 2 of the file.
tail -n +2 file.txt > file.stdout
@Evan Teitelmanに続いて、次のことができます。
tail -n +2 file.txt | sponge file.txt
一時ファイルを避けるため。別のオプションは次のとおりです。
echo "$(tail -n +2 file.txt)" > file.txt
などなど。最後のテスト:
[user@work ~]$ cat file.txt
line 1
line 2
line 3
line 4
line 5
[user@work ~]$ echo "$(tail -n +2 file.txt)" > file.txt
[user@work ~]$ cat file.txt
line 2
line 3
line 4
line 5
[user@work ~]$
改行が失われました(以下の@ 1_CRコメントごと)。代わりに試してください:
printf "%s\n\n" "$(tail -n +2 file.txt)" > file.txt
[user@work ~]$ cat file.txt
line 1
line 2
line 3
line 4
line 5
[user@work ~]$ printf '%s\n\n' "$(tail -n +2 file.txt)" > file.txt
[user@work ~]$ cat file.txt
line 2
line 3
line 4
line 5
[user@work ~]$
sedに戻って、試してください:
printf '%s\n\n' "$(sed '1d' file.txt)" > file.txt
多分
echo -e "$(sed '1d' file.txt)\n" > file.txt
副作用を避けるため。
tail
トリックはうまくいきました(130mbファイルで3秒未満かかりました)。ありがとう!
echo "$(tail -n +2 file.txt)" > file.txt
完璧な答えです。
また、見とるsponge
からを
moreutils
。sponge
ファイルに書き込む前に、標準入力の書き込み終了が終了するまで、標準入力からデータを吸収します。次のように使用されます。
sed '1d' file.txt | sponge file.txt
このトピックは興味があるので、3つの方法でベンチマークをテストします。
sed '1d' d.txt > tmp.txt
tail -n +2 d.txt > tmp.txt
sed -i '1d' d.txt
ターゲットd.txt
は5.4GBファイルであることに注意してください
結果を取得する:
run 1 : sed '1d' d.txt > r1.txt
14s
run 2 : tail -n +2 d.txt > r2.txt
20s
run 3 : sed -i '1d' d.txt
88s
結論:以下が最も速い方法のようです:
sed '1d' file.txt > tmpfile; mv tmpfile file.txt
sed '1d' d.txt
方法は含まれていませんでした(またはので、それはあなたのテストを読んでいるようだ)mv
コマンド。20MBファイルを使用したFreeBSDでのテストでsed -i
は、これが最も高速でした。
sed
では、を使用できますsed -i .bak '1d' file.txt
。