ファイルの最初の行を削除して変更を保持するにはどうすればよいですか?
私はこれを試しましたが、ファイルの内容全体が消去されます。
$sed 1d file.txt > file.txt
そのコマンドがシェルが実行する順序である後、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
代替の非常に軽量なオプションは、最初の行を除いてすべてを「テール」にすることです(これは一般にファイルヘッダーを削除する簡単な方法です):
# -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
副作用を避けるため。
このトピックは興味深いので、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
sponge
のmoreutils
もご覧ください。 sponge
は、ファイルに書き込む前に標準入力の書き込み終了が閉じるまで、標準入力からのデータを吸収します。それは次のように使用されます:
sed '1d' file.txt | sponge file.txt
ex
は真のインプレース編集に使用できます 一時ファイルは含まれません
ex -c ':1d' -c ':wq' file.txt
sed
を使用してファイルから最初の行を削除する最も簡単な方法は、次のとおりです。
$ sed -i -n -e '2,$p' file.txt
VimはExモードで使用できます。
ex -s -c '1d|x' file.txt
1
最初の行を検索
d
削除
x
保存して閉じる
Vimを使用してこれを行うことができます:
vim -u NONE +'1d' +wq! /tmp/test.txt
このコマンドは1行を削除し、「file.txt」として保存します。
sed '1d' file.txt > /tmp/file.txt && mv /tmp/file.txt file.txt || rm -f /tmp/file.txt
ファイル内の基準線を削除するには
Sed '1d'ファイル
Sed '1d3d'ファイル
行内の文字を削除
1 linの最初の2つのチャーターを削除する
Sed 's /^..//'ファイル
2最後の2つのクレクレチン行を削除します
Sed 's/..£//'ファイル
3空白行を削除
Sed '/ ^£/ d'ファイル