Xóa dòng đầu tiên của tệp


110

Làm cách nào để xóa dòng đầu tiên của tệp và giữ các thay đổi?

Tôi đã thử điều này nhưng nó xóa toàn bộ nội dung của tập tin.

$sed 1d file.txt > file.txt

Câu trả lời:


81

Lý do file.txt trống sau lệnh đó là thứ tự mà shell thực hiện. Điều đầu tiên xảy ra với dòng đó là chuyển hướng. Tệp "file.txt" được mở và cắt thành 0 byte. Sau đó, lệnh sed chạy, nhưng tại thời điểm đó tệp đã trống.

Có một vài lựa chọn, hầu hết liên quan đến việc ghi vào một tệp tạm thời.

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
Với BSD sed, bạn có thể sử dụng sed -i .bak '1d' file.txt.

1
Có cách nào không bao gồm tập tin tạm thời? Dù sao, điều này sẽ làm các mẹo. Cảm ơn rất nhiều!
kickass13

@ kickass13 có thể sử dụng trình soạn thảo văn bản như ed.
jordanm

6
Các edlệnh sẽ là: printf "%s\n" 1d w q | ed file.txt(I tim ed)
glenn jackman

1
@jonayreyes-exec sed -i '1d' {} \;
jordanm

141

Một tùy chọn rất nhẹ khác chỉ là 'cắt đuôi' mọi thứ trừ dòng đầu tiên (đây có thể là một cách dễ dàng để loại bỏ các tiêu đề tệp nói chung):

# -n +2 : start at line 2 of the file.
tail -n +2 file.txt > file.stdout

Theo dõi @Evan Teitelman, bạn có thể:

tail -n +2 file.txt | sponge file.txt

Để tránh một tập tin tạm thời. Một lựa chọn khác có thể là:

echo "$(tail -n +2 file.txt)" > file.txt

Và kể từ đó trở đi. Kiểm tra lần cuối:

[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 ~]$ 

Rất tiếc, chúng tôi đã mất một dòng mới (mỗi bình luận @ 1_CR bên dưới), thay vào đó hãy thử:

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 ~]$ 

Quay trở lại với sed, thử:

printf '%s\n\n' "$(sed '1d' file.txt)" > file.txt

hoặc có lẽ

echo -e "$(sed '1d' file.txt)\n" > file.txt

Để tránh tác dụng phụ.


Tôi vừa thử nó trên hệ thống Fedora của tôi và đầu ra ở trên. Bạn đã đúng - cảm ơn vì đã chỉ ra điều đó.
AsymLabs

Thủ tailthuật này hiệu quả với tôi (mất chưa đến 3 giây trên tệp 130mb). Cảm ơn!
elo80ka

echo "$(tail -n +2 file.txt)" > file.txtlà câu trả lời hoàn hảo.
Alex Raj Kaliamoorthy

Cảm ơn bạn! echo "$ (tail -n +2 file.txt)"> file.txt hoạt động với tôi giống như một bùa mê!
Arsenii

16

Cũng hãy xem spongetừ moreutils. spongengâm dữ liệu từ đầu vào tiêu chuẩn cho đến khi kết thúc ghi của đầu vào tiêu chuẩn đóng trước khi ghi vào tệp. Nó được sử dụng như vậy:

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

14

Chủ đề này được quan tâm, vì vậy tôi kiểm tra điểm chuẩn theo 3 cách:

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

Lưu ý rằng mục tiêu d.txtlà tệp 5,4 GB

Nhận kết quả:


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

Kết luận: Có vẻ như dưới đây là cách nhanh nhất:

sed '1d' file.txt > tmpfile; mv tmpfile file.txt


sed '1d' d.txtPhương pháp của bạn không bao gồm (hoặc có vẻ như bằng cách đọc các bài kiểm tra của bạn) mvlệnh. Trong các thử nghiệm của tôi trên FreeBSD với tệp 20 MB sed -ilà nhanh nhất.
Sopalajo de Arrierez

9

excó thể được sử dụng để chỉnh sửa tại chỗ thực sự không liên quan đến tệp tạm thời

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

2
ex không sử dụng tập tin tạm thời. strace -e open ex -c ':1d' -c ':wq' foo. ex cắt ngắn tệp gốc bằng tệp tạm thời, trong đó tùy chọn GNU sed -i ghi đè lên bản gốc bằng tệp tạm thời. Tôi không chắc làm thế nào sed của BSD hoạt động.
llua

@llua, bạn nói đúng. Tôi cũng nhận thấy điều đó, nhưng sau đó
iruvar

3

Cách ngắn nhất và đơn giản nhất để xóa dòng đầu tiên khỏi tệp bằng cách sử dụng sedlà:

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

3

Bạn có thể sử dụng Vim trong chế độ Ex:

ex -s -c '1d|x' file.txt
  1. 1 tìm dòng đầu tiên

  2. d xóa bỏ

  3. x lưu và đóng


0

Lệnh này sẽ xóa 1 dòng và lưu dưới dạng "file.txt".

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

0

Để xóa một dòng praticiler trong tập tin

  1. Xóa dòng đầu tiên

Tập tin '1d'

  1. Xóa dòng đầu tiên và thứ ba

Tập tin '1d3d'

Xóa charecter trong dòng

1 Xóa hai điều lệ đầu tiên trong lin

Tập tin của Sed 's / ^ ..

2 Xóa hai dòng chrectercin cuối cùng

Tập tin của Sed 's / .. £ //'

3 Xóa dòng trống

Tập tin '/ ^ £ / d'


4
Có phải người Anh đã chiếm lại các thuộc địa? Lần cuối cùng tôi nhìn, £$.
G-Man

£ chỉ dấu hiệu xe đẩy ..
Vivek parikh

0

Có thể sử dụng vim để làm điều này:

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

-2

tập tin mèo01 | sed -e '1,3d'

// hiển thị nội dung trong tệp01 nhưng xóa dòng thứ nhất và thứ ba


2
lệnh sed bạn đưa ra sẽ xóa các dòng 1, 2 và 3.
icarus

1
Điều này xóa nhiều hơn yêu cầu và không "giữ những thay đổi"
Jeff Schaller
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.