2012-03-16 37 views
11

Tôi đọc qua diễn đàn để biết cách giải quyết vấn đề của mình, nhưng không có chủ đề liên quan nào có thể sử dụng được cho tôi, với kiến ​​thức lập trình hạn chế, để áp dụng cho vấn đề cụ thể của tôi.Sed để xóa một loạt các dòng từ một đường phù hợp cụ thể TILL một đường phù hợp cụ thể (không bao gồm dòng cuối cùng)

Vấn đề của tôi là: Tôi cần loại bỏ các dòng rác được nhóm lại trong tệp của mình, nhưng nằm giữa các cụm đường có thể sử dụng được. Tôi đã tìm kiếm hướng dẫn sử dụng sed và các nguồn thông tin khác về việc xóa các dải phù hợp với các mẫu, nhưng chúng chỉ đề cập đến xóa mẫu đối sánh UNTIL, chứ không phải TILL.

Bây giờ tôi muốn chỉ định một phạm vi mà sed xóa các dòng bắt đầu từ dòng đầu tiên khớp với dòng mẫu cho đến khi dòng khớp với mẫu khác. Hơn nữa, sed cần phải nhận ra các mẫu tồn tại ở cuối dòng.

Ví dụ:

line 1 
blah blah 1 
blah blah 2 
blah blah 3 
blah blah 4 
line 2 
line 3 

quả cần phải được:

line 1 
blah blah 1 
line 2 
line 3 

Xin lưu ý nhiều ranh giới giữa dòng và và dòng 2. Trong khi blah blah 1 nhu cầu ở lại, 3 nhu cầu khác sẽ bị xóa.

Cảm ơn!

+1

+1 cho được định dạng câu hỏi, với đầu vào mẫu, và sản lượng yêu cầu. Chúc may mắn. – shellter

Trả lời

13

Hãy thử điều này

sed -n '/line 1/{;p;n;p;};/line 2/,$p' sedTest1.txt 

#output 
line 1 
blah blah 1 
line 2 
line 3 

SED deconstructed:

sed -n '/line 1/{;p;n;p;};/line 2/,$p' sedTest1.txt 
    | |  |  |  |||-> print the range 
    | |  |  |  ||-> til end of file (the '$' char) 
    | |  |  |  |-> range operator (i.e. start,end) 
    | |  |  |-> beginning of range to watch for and print 
    | |  |-> now print line, get 'n'ext, print that line 
    | |-> match the line with text 'line 1' 
    |-> don't print every line, only ones flagged with 'p' 

đọc này từ dưới lên.

Ngoài ra, vì dữ liệu của bạn là một mẫu, VÀ bạn gọi nó là các dòng rác, nó có thể không đơn giản như vậy. Bạn sẽ cần phải xem qua hướng dẫn sed để có được tốc độ.

Tôi hy vọng điều này sẽ hữu ích.

+0

Cảm ơn bạn đã chia sẻ ý tưởng của mình với tôi về cách giải quyết vấn đề của tôi. Hiện tại tôi không có quyền truy cập vào máy chủ mà tôi cần kiểm tra điều này, nhưng tôi sẽ thông báo cho bạn khi tôi đã thử. Chúc mừng, – FlyingDutch

+0

Cảm ơn, hoạt động hoàn hảo, được nhiều người đánh giá cao! – FlyingDutch

+0

Rất vui được giúp đỡ. Bạn sẽ đánh dấu điều này là được chấp nhận? (Xem http://i.imgur.com/uqJeW.png). Ngoài ra, nếu bạn định tiếp tục làm việc với sed, hãy nhớ đọc http://www.grymoire.com/Unix/Sed.html VÀ để nâng cao kỹ năng xử lý văn bản của bạn, hãy sử dụng awk, http: //www.grymoire. com/Unix/Awk.html. Chúc may mắn! – shellter

0
$ sed -n '/line 1/{p;n;p;:a;n;/line 2/{:c;p;n;bc};ba};p' input.txt 
line 1 
blah blah 1 
line 2 
line 3 
+0

Cảm ơn bạn đã chia sẻ ý tưởng của mình với tôi. Hiện tại tôi không thể truy cập vào máy chủ của mình để kiểm tra xem nó có hoạt động hay không, nhưng tôi sẽ liên hệ lại với bạn. Chúc mừng – FlyingDutch

1

Điều này có thể làm việc cho bạn:

sed '/line 1/,/line 2/{//!d;/line 1/N}' file 
line 1 
blah blah 1 
line 2 
line 3 

hay này (nếu các dãy không liên tiếp):

sed '/line 1/,/line 2/{//!d;$!N}' file 
line 1 
blah blah 1 
line 2 
line 3 
+0

Yep hoạt động giống như một sự quyến rũ. Cảm ơn – FlyingDutch

Các vấn đề liên quan