2013-08-04 29 views
5

Tôi muốn nối một vài dòng, thực hiện kết hợp regex trên chúng và in chúng. Tôi đã cố gắng làm điều đó với sed.Regex với sed, tìm kiếm trên nhiều dòng

Cụ thể, tôi đã sử dụng:

cat add | sed -rn '/FIRST_LINE_REGEX/,/LAST_LINE_REGEX/s/SOME_REGEX/&/p' 

It in chỉ các dòng phù hợp với SOME_REGEX trong khi tôi mong đợi nó để nối các đường từ dãy giữa FIRST_LINE và LAST_LINE và in nối nếu nó phù hợp với SOME_REGEX.

Trả lời

9

Khi sử dụng '/FIRST_LINE_REGEX/,/LAST_LINE_REGEX/' mỗi dòng vẫn được xử lý riêng biệt, để nối các đường bạn cần sử dụng khoảng trống hoặc lệnh N để nối dòng tiếp theo vào vùng mẫu. Đây là một lựa chọn:

cat add | sed -rn '/FIRST_LINE_REGEX/{:a;N;/LAST_LINE_REGEX/{/SOME_REGEX/p;d};ba}' 

phiên bản nhận xét:

cat add | sed -rn '/FIRST_LINE_REGEX/ { # if line matches /FIRST_LINE_REGEX/ 
    :a          # create label a 
    N          # read next line into pattern space 
    /LAST_LINE_REGEX/ {      # if line matches /LAST_LINE_REGEX/ 
    /SOME_REGEX/p       # print if line matches /SOME_REGEX/ 
    d          # return to start 
    } 
    ba          # return to label a 
}' 
+0

Đó chính là điều tôi muốn, cảm ơn. –

0

sed -n '/FIRST_LINE_REGEX/,/LAST_LINE_REGEX/p' add | sed -n '/FIRST_LINE_REGEX/ b check; H; $ b check; b; :check; x; /SOME_REGEX/p'

Động lực của phần đường ống thứ hai xuất phát từ đây: https://stackoverflow.com/a/6287105/992834

Edit: Sửa đổi dành cho khi SOME_REGEX là ở giữa.

+0

Điều này sẽ vẫn chỉ in các dòng có chứa 'SOME_REGEX', tôi nghĩ rằng OP muốn in toàn bộ các khối bắt đầu bằng' FIRST_LINE_REGEX', kết thúc bằng 'LAST_LINE_REGEX' và chứa' SOME_REGEX'. –

+0

Vấn đề là phần đầu tiên chuyển các dòng dưới dạng dòng và chúng vẫn được xử lý riêng biệt. Tôi muốn phần thứ hai in tất cả nội dung giữa FIRST_LINE và SECOND_LINE nếu nội dung khớp với SOME_REGEX –

+0

Nhấn mạnh vào "nếu nó khớp với SOME_REGEX". được ghi nhận hợp lệ –

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