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

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

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

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

$sed 1d file.txt > file.txt

答え1

もう1つの非常に簡単なオプションは、最初の行を除くすべての項目を「追跡」することです(これはファイルヘッダーを削除する簡単な方法であることがよくあります)。

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

副作用を避けるため。

答え2

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

答え3

トピックは興味深く、次の3つの方法でベンチマークをテストしました。

  1. sed '1d' d.txt > tmp.txt
  2. tail -n +2 d.txt > tmp.txt
  3. sed -i '1d' d.txt

ターゲットはd.txt5.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

答え4

ex一時ファイルを含まない真の内部編集に使用できます。

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

関連情報