Làm cách nào để xóa tất cả các dòng trong tệp bắt đầu từ sau một dòng phù hợp?


84

Tôi có một tệp được tạo thành từ một số dòng văn bản:

The first line
The second line
The third line
The fourth line

Tôi có một chuỗi là một trong các dòng: The second line

Tôi muốn xóa chuỗi và tất cả các dòng sau nó trong tệp, vì vậy nó sẽ xóa The third lineThe fourth linethêm vào chuỗi. Tệp sẽ trở thành:

The first line

Tôi đã tìm kiếm một giải pháp trên google và có vẻ như tôi nên sử dụng sed. Cái gì đó như:

sed 'linenum,$d' file

Nhưng làm thế nào để tìm số dòng của chuỗi? Hoặc, tôi nên làm như thế nào khác?


Tuyên bố vấn đề của bạn mâu thuẫn: 'Tôi muốn xóa tất cả các dòng sau dòng' có nghĩa là bạn chỉ xóa hai dòng (như bạn nói), nhưng sau đó đầu ra ví dụ của bạn hiển thị dòng khớp cũng bị thiếu. Bạn thực sự muốn cái nào?
Jonathan Leffler

Dòng phù hợp VÀ tất cả các dòng sau nó. Tôi nên cải thiện tiếng Anh của mình. Cảm ơn thông tin của bạn.
DocWiki

Câu trả lời:


136

Nếu bạn không muốn in dòng phù hợp (hoặc bất kỳ dòng nào sau đây):

sed -n '/The second line/q;p' inputfile

Điều này cho biết "khi bạn đến dòng phù hợp với mẫu, hãy thoát ra, nếu không hãy in từng dòng". Các -ntùy chọn ngăn chặn in ấn ngầm và các plệnh được bắt buộc phải in rõ ràng dòng.

hoặc là

sed '/The second line/,$d' inputfile

Điều này cho biết "xóa tất cả các dòng khỏi đầu ra bắt đầu từ dòng phù hợp và tiếp tục đến cuối tệp".

nhưng cái đầu tiên nhanh hơn. Tuy nhiên, nó sẽ ngừng xử lý hoàn toàn, vì vậy nếu bạn có nhiều tệp làm đối số, những tệp sau tệp khớp đầu tiên sẽ không được xử lý. Trong trường hợp này, hình thức xóa là tốt hơn.

Nếu bạn muốn in dòng phù hợp, nhưng không in dòng nào sau đây:

sed '/The second line/q' inputfile

Điều này cho biết "in tất cả các dòng và thoát ra khi đạt đến dòng phù hợp" ( -ntùy chọn (không in ẩn) không được sử dụng).

Xem man sed để biết thêm thông tin.


3
Nhưng một số lệnh khiến bạn khó hiểu về đường ống bị hỏng ( co -pví dụ như RCS ), và sau đó bạn nên sử dụng sed '/The second line/,$d'ký hiệu.
Jonathan Leffler

Bạn có thể vui lòng thêm giải thích?
Ahmad Abdelghany

@AhmadAbdelghany: Đã thêm giải thích.
Tạm dừng cho đến khi có thông báo mới.

@DennisWilliamson Cảm ơn rất nhiều.
Ahmad Abdelghany

phương thức đầu tiên in ra dòng cuối cùng trước dòng phù hợp hai lần. xóa các công việc psau ;.
CrazyFrog 29/09/17

27

Điều này ngắn hơn một chút so với các giải pháp đã cho khác. Bỏ sử dụng vốn Q tránh in dòng hiện tại.

 sed '/The second line/Q' file

Để thực sự xóa các dòng, bạn có thể sử dụng cùng một cú pháp.

 sed -i '/The second line/Q' file

1
Đây là giải pháp yêu thích của tôi.
TryTryAgain

5
sed '/The second line/q0' file

Hoặc, không có gnu sed:

sed '/The second line/q' file

Hoặc, sử dụng grep:

grep -B 9999999 "The second line"

Cảm ơn bạn rất nhiều! Bạn có thể cho tôi biết làm thế nào tôi có thể tìm thấy số dòng của một chuỗi cụ thể, mà tôi vẫn chưa biết.
DocWiki

grep -n "Dòng thứ hai" | awk -F: '{print $ 1}'
Erik

@DocWiki: bạn không cần số dòng; bạn tìm kiếm nó. sed "/$string/,\$d" inputfile.
Jonathan Leffler

5

Sử dụng awk (không hiển thị dòng phù hợp)

awk '/pattern/ {exit} {print}' file.txt

Đây là câu trả lời tốt nhất, vì bạn có thể không biết giá trị của dòng thứ hai.
RonJohn

0

Đầu tiên hãy thêm số dòng và xóa dòng

cat new.txt 
The first line
The second line
The third line
The fourth line

 cat new.txt  | nl
     1  The first line
     2  The second line
     3  The third line
     4  The fourth line



cat new.txt  | nl | sed  "/2/d"
     1  The first line
     3  The third line
     4  The fourth line

cat new.txt  |  nl |sed  "3d;4d"
     1  The first line
     2  The second line

sử dụng awk

awk 'NR!=3 && NR!=4' new.txt 
The first line
The second line

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.