2013-06-28 46 views
12

Tôi đang sử dụng sed để lọc danh sách tệp. Tôi có một danh sách các thư mục được sắp xếp và tôi muốn lấy tất cả các dòng sau một thư mục cụ thể. Để thực hiện tác vụ này, tôi đang sử dụng giải pháp được mô tả here hoạt động khá tốt với bất kỳ đầu vào nào tôi đã thử nhưng nó không hoạt động khi kết quả khớp trên dòng đầu tiên. Trong trường hợp đó sed sẽ loại bỏ tất cả các dòng đầu vàoXóa tất cả các dòng trước khi khớp với sed

Ở đây nó là một ví dụ:

(ssh) [email protected] : ~ 
[0] % ls -1/
bin 
boot 
... 
sys 
tmp 
usr 
var 
vmlinuz 

(ssh) [email protected] : ~ 
[0] % ls -1/| sed '1,/tmp/d' 
usr 
var 
vmlinuz 

(ssh) [email protected] : ~ 
[0] % ls -1/| sed '1,/^bin$/d' 
# sed will delete all lines from the input stream 

Làm thế nào tôi nên thay đổi lệnh để xem xét cũng là trường hợp giới hạn khi dòng đầu tiên được kết hợp bởi regexp?

BTW sed '1,1d' hoạt động chính xác và chỉ xóa dòng đầu tiên.

+0

Cảm ơn bạn đã nhận xét. Sửa chữa và thêm vài giải pháp khác nữa. – jm666

Trả lời

14

thử này (GNU chỉ sed):

sed '0,/^bin$/d' 

..output là:

 
$sed '0,/^bin$/d' file 
boot 
... 
sys 
tmp 
usr 
var 
vmlinuz 
+0

Điều này có vẻ là lựa chọn tốt nhất. Tôi thấy câu trả lời trước đó của bạn mà nói rằng nó hoạt động cho GNU sed, bây giờ bạn loại bỏ điều đó. Tôi đang sử dụng GNU sed, vì vậy đối với tôi đây là câu trả lời đúng, nhưng chỉ cho tò mò, nó sẽ làm việc cho non GNU sed? – Fabio

+0

không có lệnh GNU cụ thể, nó sẽ hoạt động, cho tôi biết cuốn sách văn bản của tôi. – Endoro

+0

Nó không hoạt động trên OS X sed, nhưng như tôi đã nói với bạn tôi cần nó trên một hệ thống gnu. – Fabio

11

Lệnh này sed sẽ in tất cả các dòng sau và bao gồm các dòng phù hợp:

sed -n '/^WHATEVER$/,$p' 

Công tắc -n chỉ làm cho sed in khi được thông báo (số p lệnh).

Nếu bạn không muốn bao gồm các dòng phù hợp bạn có thể nói sed xóa từ khi bắt đầu của tập tin vào dòng phù hợp: (. Chúng tôi sử dụng lệnh d mà xóa dòng)

sed '1,/^WHATEVER$/d' 

+0

Tôi cũng đã khám phá tùy chọn này và tôi thoát vì bao gồm cả dòng phù hợp. Tôi đã bỏ lỡ tùy chọn 'tail -n + 2'. Vì vậy, điều này cũng tốt. Cảm ơn. – Fabio

+0

Bạn đã cứu ngày của tôi. Rất đơn giản để hiểu và fonctional đầy đủ. Chắc chắn câu trả lời tốt nhất nếu phù hợp với dòng nên được bao gồm. – jmcollin92

4

bạn cũng có thể thử với:

awk '/searchname/{p=1;next}{if(p){print}}' 
Các vấn đề liên quan