Xóa dòng cuối cùng khỏi tệp


44

Tôi sử dụng sed để nhanh chóng xóa các dòng với vị trí cụ thể như

sed '1d'
sed '5d'

Nhưng, điều gì sẽ xảy ra nếu tôi muốn xóa dòng cuối cùng của tệp và tôi không biết số lượng dòng (Tôi biết tôi có thể có được điều đó bằng cách sử dụng wcvà một số thủ thuật khác).

Hiện tại, sử dụng một cách giải quyết với headtailkết hợp với wcđể làm như vậy. Bất kỳ xoắn nhanh chóng ở đây?


Mà os? Một số hương vị có các tùy chọn thú vị cho headtail...
Nils

@Nils Tôi đang trên 'Red Hat Enterprise Linux Server phát hành 5.5 (Tikanga)'. Bạn có thể chỉ cho các tùy chọn cho headtailbạn biết về các hương vị khác nhau?
mtk

Tôi đã làm. Xem bên dưới.
Nils

Câu trả lời:


88

trong sed $là dòng cuối cùng để xóa dòng cuối cùng:

sed '$d' <file>

12
Sử dụng sed -i '$d' <file>để chỉnh sửa tập tin tại chỗ.
Đi lang thang

1
Điều gì sẽ là để xóa n dòng cuối cùng, trong đó n là bất kỳ số nguyên nào?
Joshua Salazar

31

$ cho dòng cuối cùng:

sed '$d' file

9
đánh bại bạn sau 30 giây: P
h3rrmiller

1
Đáng buồn thay, mặc dù người ta phải sử dụng các kỹ thuật phức tạp hơn để xóa, giả sử, hai dòng cuối cùng.
dubiousjim

Ý anh là gì? sed '$d' file; sed '$d' file
Cướp

3
@Rob: sed '$d' filekhông thực sự sửa đổi tập tin; nó chỉ in ra nội dung của tập tin, trừ dòng cuối cùng. Vì vậy, sed '$d' file; sed '$d' filesẽ in ra nội dung của tệp hai lần , trừ dòng cuối cùng mỗi lần. Tương đương xóa hai dòng cuối cùng sed '$d' filesed '$d' file | sed '$d'.
ruakh

2
Vâng, đó là không phù hợp nhưng tất nhiên nó hoạt động. Tôi sẽ làm điều đó trong một lần với sed -n '1{h;n;}; $q; x; p;'. Tôi đã bĩu môi mà chúng ta không thể làm sed '$-1,$d'.
dubiousjim

14

cat file.txt | head -n -1 > new_file.txt

Hãy cẩn thận, dường như, tùy thuộc vào dòng cuối cùng file.txt(nếu kết thúc bằng EOF, hoặc \nsau đó EOF), số lượng dòng trong new_file.txtcó thể giống nhau (như file.txt) sau lệnh này (điều này xảy ra khi không có \n) - trong mọi trường hợp, nội dung của dòng cuối cùng bị xóa.

Ngoài ra, lưu ý rằng bạn phải sử dụng tệp thứ hai (trung gian). Nếu bạn mèo và chuyển hướng đến cùng một tệp, bạn sẽ xóa nó.


6
Trường hợp này hoạt động, nó cũng có thể đơn giản head -n -1 file.txt > new_file.txt. Lưu ý rằng mặc dù số lượng âm head -nchỉ có sẵn cho một số triển khai head. Ví dụ: nó không hoạt động cho FreeBSD hoặc cho phiên bản BusyBox của head.
dubiousjim

1
@dubiousjim: Đồng ý, head -n -1 file.txt > new_file.txtlà tốt hơn. Nó hoạt động theo cùng một cách đối với hai bình luận của tôi (cùng số dòng và xóa trên cùng một tệp). Đối với đối số phủ định, sự khác biệt như vậy thỉnh thoảng xảy ra giữa các Unix và chúng thường gây nản lòng vì bạn mong đợi nó hoàn toàn là cùng một lệnh (và tại sao bạn - cùng tên và mục đích!) - dù sao đi nữa, tốt điểm. (Tôi sử dụng Debian.)
Emanuel Berg

5

head --lines=-1. Lần đầu tiên tôi tình cờ phát hiện ra khả năng này trong trang hướng dẫn về hệ thống SLES11SP2 (coreutils-8.12-6.23.1)

tailheadlà một phần của coreutils-rpm (ít nhất là đối với các hệ thống dựa trên vòng / phút).

Theo thay đổi của coreutils, cú pháp này được hỗ trợ kể từ coreutils-phiên bản 5.0.1

Tin xấu: Theo trang RH5, tùy chọn này không được mô tả

Tin tốt: Nó hoạt động với RH5 (vì vậy trong trường hợp của bạn: nó hoạt động - ít nhất là với phiên bản hiện tại của RH5).

rpm -q coreutils hiển thị cho tôi (trên CentOS 5.8): coreutils-5.97-34.el5_8.1

Tôi không chắc chắn nếu RH5.5. đã có phiên bản coreutils hỗ trợ nó. Nhưng dù sao 5.5 cũng có EoLed.


+1. nó hoạt động hoàn hảo trên RH5.5. Cảm ơn.
mtk

0

Linux

$ là dòng cuối cùng, d để xóa:

sed '$d' ~/path/to/your/file/name

Hệ điều hành Mac

Tương đương của sed -i

sed -i '' -e '$ d' ~/path/to/your/file/name
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.