Hapus Baris pertama file

110

Bagaimana saya bisa menghapus baris pertama file dan menyimpan perubahan?

Saya mencoba ini tetapi menghapus seluruh isi file.

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

Jawaban:

81

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
jordanm
sumber
2
Dengan BSD sed, Anda dapat menggunakan sed -i .bak '1d' file.txt.
1
apakah ada cara yang tidak termasuk file temp? Bagaimanapun, ini akan melakukan triknya. Terima kasih banyak!
kickass13
@ kickass13 mungkin menggunakan editor teks seperti ed.
jordanm
6
The edperintah akan menjadi: printf "%s\n" 1d w q | ed file.txt(I ed jantung)
glenn jackman
1
@jonayreyes-exec sed -i '1d' {} \;
jordanm
141

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.

AsymLabs
sumber
Saya baru saja mencobanya di sistem Fedora saya dan hasilnya di atas. Anda benar - terima kasih telah menunjukkannya.
AsymLabs
The tailtrick bekerja untuk saya (waktu kurang dari 3 detik pada file 130MB). Terima kasih!
elo80ka
echo "$(tail -n +2 file.txt)" > file.txtadalah jawaban sempurna.
Alex Raj Kaliamoorthy
Terima kasih! echo "$ (tail -n +2 file.txt)"> file.txt bekerja untuk saya seperti pesona!
Arsenii
16

Lihat juga spongedari moreutils. spongerendam data dari input standar hingga akhir penulisan input standar ditutup sebelum menulis ke file. Digunakan seperti ini:

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

sumber
14

Topik ini menarik, jadi saya menguji tolok ukur dalam 3 cara:

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

Perhatikan bahwa targetnya d.txtadalah 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

waue0920
sumber
sed '1d' d.txtMetode Anda tidak termasuk (atau sepertinya itu dengan membaca tes Anda) mvperintah. Dalam pengujian saya di FreeBSD dengan file 20MB sed -iitu adalah yang tercepat.
Sopalajo de Arrierez
9

exdapat digunakan untuk pengeditan di tempat yang benar yang tidak melibatkan file temp

ex -c ':1d' -c ':wq' file.txt
iruvar
sumber
2
ex memang menggunakan file temp. 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.
llua
@ llua, kamu benar. Saya perhatikan itu juga, tetapi kemudian
iruvar
3

Cara terpendek dan termudah untuk menghapus baris pertama dari file yang digunakan sedadalah:

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

Anda dapat menggunakan Vim dalam mode Ex:

ex -s -c '1d|x' file.txt
  1. 1 temukan baris pertama

  2. d menghapus

  3. x Simpan dan tutup

Steven Penny
sumber
0

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
Ritesh Singh
sumber
0

Untuk menghapus baris praticiler dalam file

  1. Hapus baris pertama

Sed '1d' file

  1. Hapus baris pertama dan ketiga

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

Vivek parikh
sumber
4
Apakah Inggris merebut kembali koloni? Terakhir kali saya melihat, £$.
G-Man
Tanda
boneka yang
0

Bisa menggunakan vim untuk melakukan ini:

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

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

// tampilkan konten dalam file01 tetapi hapus baris pertama dan ketiga

pengguna215264
sumber
2
perintah sed yang Anda berikan akan menghapus baris 1, 2 dan 3.
icarus
1
Ini menghapus lebih dari yang diminta dan tidak "menyimpan perubahan"
Jeff Schaller