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

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

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.


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

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


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

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

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


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

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


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

-2

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

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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.