web-dev-qa-db-ja.com

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

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

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

$sed 1d file.txt > file.txt
120
kickass13

そのコマンドがシェルが実行する順序である後、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
87
jordanm

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

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

副作用を避けるため。

155
AsymLabs

このトピックは興味深いので、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

17
waue0920

spongemoreutilsもご覧ください。 spongeは、ファイルに書き込む前に標準入力の書き込み終了が閉じるまで、標準入力からのデータを吸収します。それは次のように使用されます:

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

exは真のインプレース編集に使用できます 一時ファイルは含まれません

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

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

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

VimはExモードで使用できます。

ex -s -c '1d|x' file.txt
  1. 1最初の行を検索

  2. d削除

  3. x保存して閉じる

3
Steven Penny

Vimを使用してこれを行うことができます:

vim -u NONE +'1d' +wq! /tmp/test.txt
0
Hongbo Liu

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

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

ファイル内の基準線を削除するには

  1. 最初の行を削除

Sed '1d'ファイル

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

Sed '1d3d'ファイル

行内の文字を削除

1 linの最初の2つのチャーターを削除する

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

2最後の2つのクレクレチン行を削除します

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

3空白行を削除

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

0
Vivek parikh