2012-05-14 31 views
12

Tôi đang viết tập lệnh tìm kiếm các dòng khớp với một số mẫu. Tôi phải sử dụng sed cho kịch bản này. này hoạt động tốt để tìm kiếm và dòng in lần xuất hiện:Đánh số các dòng khớp với mẫu bằng cách sử dụng sed

sed -n /PATTERN/p 

Tuy nhiên, tôi cũng muốn in số dòng hợp lệ ở phía trước của dòng riêng của mình. Tôi có thể làm điều đó bằng cách sử dụng sed như thế nào?

+2

Bạn muốn họ đánh số liên tiếp hoặc dựa trên số dòng họ bên trong file? –

Trả lời

13

Bạn có thể sử dụng grep:

grep -n pattern file 

Nếu bạn sử dụng = trong sed số dòng sẽ được in trên một dòng riêng biệt và không có sẵn trong không gian mô hình cho các thao tác. Tuy nhiên, bạn có thể dẫn đầu ra thành một thể hiện khác của sed để hợp nhất số dòng và dòng nó áp dụng.

sed -n '/pattern/{=;p}' file | sed '{N;s/\n/ /}' 
+0

điều này hoàn hảo !! Sed giải pháp hoạt động tuyệt vời. Cảm ơn! – almas

2

Chuyển sang chế độ chờ.

BEGIN { 
    ln=0 
} 

$0 ~ m { 
    ln+=1 
    print ln " " $0 
    next 
} 

{ 
    print $0 
} 

...

awk -f script.awk -v m='<regex>' < input.txt 
9

= được sử dụng để in số dòng.

sed -n /PATTERN/{=;p;} 
+0

tôi làm điều này: cat "$ FILE" | sed -n/"$ pattern"/{=; p;}, nhưng tôi gặp lỗi: lỗi cú pháp gần mã thông báo không mong muốn '} ' – almas

+0

bạn cần'; =; ... 'chúc may mắn. – shellter

+3

@zum: Di chuyển dấu ngoặc kép của bạn để chúng ở bên ngoài tập lệnh: 'sed -n'/$ pattern/{=; p;} "" $ FILE "' –

2

Sử dụng Perl:

perl -ne 'print "$.: $_" if /regex/' input.file 

$. chứa số dòng. Nếu tập tin đầu vào bao gồm:

record foo 
bar baz 
record qux 

này một-liner: perl -ne 'print "$.: $_" if /record/' input.file sẽ in:

1: record foo 
3: record qux 

Hoặc nếu bạn chỉ muốn tổng số dòng phù hợp việc sử dụng mẫu:

perl -lne '$count++ if /regex/; END { print int $count }' input.file

8

Đối với sed, sử dụng sau để lấy số dòng

sed -n /PATTERN/= 
1

Dưới đây là cách đơn giản nhất:

awk '{print ln++ ": " $0 }' 
Các vấn đề liên quan