Jawaban:
Alasan file.txt kosong setelah perintah itu adalah urutan di mana shell melakukan sesuatu. Hal pertama yang terjadi dengan garis itu adalah pengalihan. File "file.txt" dibuka dan dipotong ke 0 byte. Setelah itu perintah sed berjalan, tetapi pada titik file tersebut sudah kosong.
Ada beberapa opsi, sebagian besar melibatkan penulisan ke file sementara.
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
perintah akan menjadi: printf "%s\n" 1d w q | ed file.txt
(I ed jantung)
-exec sed -i '1d' {} \;
Pilihan alternatif yang sangat ringan hanya untuk 'mengekor' segalanya kecuali baris pertama (ini bisa menjadi cara mudah untuk menghapus header file secara umum):
# -n +2 : start at line 2 of the file.
tail -n +2 file.txt > file.stdout
Mengikuti @Evan Teitelman, Anda dapat:
tail -n +2 file.txt | sponge file.txt
Untuk menghindari file sementara. Pilihan lain mungkin:
echo "$(tail -n +2 file.txt)" > file.txt
Dan seterusnya. Pengujian yang terakhir:
[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 ~]$
Ups, kami kehilangan baris baru (per @ 1_CR komentar di bawah), cobalah:
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 ~]$
Kembali ke sed, coba:
printf '%s\n\n' "$(sed '1d' file.txt)" > file.txt
atau mungkin
echo -e "$(sed '1d' file.txt)\n" > file.txt
Untuk menghindari efek samping.
tail
trick bekerja untuk saya (waktu kurang dari 3 detik pada file 130MB). Terima kasih!
echo "$(tail -n +2 file.txt)" > file.txt
adalah jawaban sempurna.
Lihat juga sponge
dari
moreutils
. sponge
rendam data dari input standar hingga akhir penulisan input standar ditutup sebelum menulis ke file. Digunakan seperti ini:
sed '1d' file.txt | sponge file.txt
Topik ini menarik, jadi saya menguji tolok ukur dalam 3 cara:
sed '1d' d.txt > tmp.txt
tail -n +2 d.txt > tmp.txt
sed -i '1d' d.txt
Perhatikan bahwa targetnya d.txt
adalah file 5.4GB
Dapatkan hasilnya:
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
Kesimpulan: Tampaknya di bawah ini cara tercepat:
sed '1d' file.txt > tmpfile; mv tmpfile file.txt
sed '1d' d.txt
Metode Anda tidak termasuk (atau sepertinya itu dengan membaca tes Anda) mv
perintah. Dalam pengujian saya di FreeBSD dengan file 20MB sed -i
itu adalah yang tercepat.
ex
dapat digunakan untuk pengeditan di tempat yang benar yang tidak melibatkan file temp
ex -c ':1d' -c ':wq' file.txt
strace -e open ex -c ':1d' -c ':wq' foo
. ex memotong file asli dengan file temp, di mana sebagai GNU sed's -i opsi menimpa yang asli dengan file temp. Saya tidak yakin bagaimana sed BSD bekerja.
Anda dapat menggunakan Vim dalam mode Ex:
ex -s -c '1d|x' file.txt
1
temukan baris pertama
d
menghapus
x
Simpan dan tutup
Perintah ini akan menghapus 1 baris dan menyimpan sebagai "file.txt".
sed '1d' file.txt > /tmp/file.txt && mv /tmp/file.txt file.txt || rm -f /tmp/file.txt
Untuk menghapus baris praticiler dalam file
Sed '1d' file
Sed '1d3d' file
Hapus charecter sejalan
1 Hapus Dua piagam pertama dalam lin
File Sed /^..// '
2 Hapus dua baris chrectercin terakhir
File Sed / .. £ // '
3 Hapus baris kosong
Sed '/ ^ £ / d' file
£
≠ $
.
Bisa menggunakan vim untuk melakukan ini:
vim -u NONE +'1d' +wq! /tmp/test.txt
cat file01 | sed -e '1,3d'
// tampilkan konten dalam file01 tetapi hapus baris pertama dan ketiga
sed
, Anda dapat menggunakansed -i .bak '1d' file.txt
.