ファイルの最初の行を削除する


110

ファイルの最初の行を削除して変更を保持するにはどうすればよいですか?

これを試しましたが、ファイルの内容全体が消去されます。

$sed 1d file.txt > file.txt

回答:


81

そのコマンドの後に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

2
BSD sedでは、を使用できますsed -i .bak '1d' file.txt

1
一時ファイルを含まない方法はありますか?とにかく、これでうまくいきます。どうもありがとう!
kickass13

@ kickass13は、おそらくなどのテキストエディタを使用していますed
ヨルダン

6
edコマンドは次のようになりますprintf "%s\n" 1d w q | ed file.txt(Iハート編)
グレン・ジャックマン

1
@jonayreyes-exec sed -i '1d' {} \;
ヨルダン

141

代替の非常に軽量なオプションは、最初の行以外をすべて「テール」にすることです(これは、一般的にファイルヘッダーを削除する簡単な方法です)。

# -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

副作用を避けるため。


Fedoraシステムで試してみましたが、出力は上記のとおりです。あなたは正しい-それを指摘してくれてありがとう。
AsymLabs

このtailトリックはうまくいきました(130mbファイルで3秒未満かかりました)。ありがとう!
elo80ka 14

echo "$(tail -n +2 file.txt)" > file.txt完璧な答えです。
アレックスラージカリアムーシー

ありがとうございました!echo "$(tail -n +2 file.txt)"> file.txtは私と同じように機能します!
Arsenii

16

また、見とるspongeからを moreutilsspongeファイルに書き込む前に、標準入力の書き込み終了が終了するまで、標準入力からデータを吸収します。次のように使用されます。

sed '1d' file.txt | sponge file.txt

14

このトピックは興味があるので、3つの方法でベンチマークをテストします。

  1. sed '1d' d.txt > tmp.txt
  2. tail -n +2 d.txt > tmp.txt
  3. 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は、これが最も高速でした。
ソパラホデアリエレス

9

ex一時ファイルを含まない真のインプレース編集に使用できます

ex -c ':1d' -c ':wq' file.txt

2
exは一時ファイルを使用します。strace -e open ex -c ':1d' -c ':wq' foo。exは、元のファイルを一時ファイルで切り捨てます。GNUsedの-iオプションは、元のファイルを一時ファイルで上書きします。BSDのsedがどのように機能するかわかりません。
llua

@llua、あなたは正しい。私も気づいたが、後に
iruvar

3

を使用してファイルから最初の行を削除する最も簡単な方法sedは次のとおりです。

$ sed -i -n -e '2,$p' file.txt


0

このコマンドは1行を削除し、「file.txt」として保存します。

sed '1d' file.txt  > /tmp/file.txt && mv /tmp/file.txt file.txt || rm -f /tmp/file.txt

0

ファイル内のpraticiler行を削除するには

  1. 最初の行を削除

SED「1D」ファイル

  1. 1行目と3行目を削除

Sed「1d3d」ファイル

行の文字を削除

1 Linの最初の2つのチャーターを削除

Sed 's /^..//'ファイル

2最後の2つのクレクテルシン行を削除します

Sed 's / ..£//'ファイル

3空行を削除する

Sed '/ ^£/ d'ファイル


4
イギリスは植民地を奪還しましたか?前回見た、£$
Gマン

£示さダラー記号...
のVivekパリキ


-2

猫file01 | sed -e '1,3d'

// file01のコンテンツを表示しますが、1行目と3行目を削除します


2
あなたが与えるのsedコマンドでは、行1、2と3が削除されます
イカロス

1
これにより、必要以上に削除され、「変更を保持」しません
ジェフシャラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.