Làm thế nào để sử dụng multiline làm phân tách nhóm trong grep?


8

Trong grepbạn có thể sử dụng --group-separatorđể viết một cái gì đó ở giữa các trận đấu nhóm.

Điều này rất hữu ích để làm rõ những khối chúng ta có, đặc biệt là khi sử dụng -C Xtùy chọn để có được các dòng ngữ cảnh.

$ cat a
hello
this is me
and this is
something else
hello hello
bye
i am done
$ grep -C1 --group-separator="+++++++++" 'hello' a
hello
this is me
+++++++++
something else
hello hello
bye

Tôi đã học cách sử dụng dòng trống làm bối cảnh "phân tách nhóm" cho grep cách chỉ có một dòng trống, bằng cách nói --group-separator="".

Tuy nhiên, nếu tôi muốn có hai dòng trống thì sao? Tôi đã cố gắng nói --group-separator="\n\n"nhưng tôi nhận được \ns:

$ grep -C1 --group-separator="\n\n" 'hello' a
hello
this is me
\n\n
something else
hello hello
bye

Những thứ khác như --group-separator="\nhello\n"không hoạt động.

Câu trả lời:


12

Ooooh tôi đã tìm thấy nó, tôi chỉ cần sử dụng $''cú pháp thay vì $"":

$ grep -C1 --group-separator=$'\n\n' 'hello' a
hello
this is me



something else
hello hello
bye

Từ man bash:

NHANH CHÓNG

Các từ có dạng $ 'chuỗi' được xử lý đặc biệt. Từ này mở rộng thành chuỗi, với các ký tự thoát dấu gạch chéo ngược được thay thế theo quy định của tiêu chuẩn ANSI C. Các chuỗi thoát dấu gạch chéo ngược, nếu có, được giải mã như sau:

(...)
\n     new line

1

Tôi đề nghị sử dụng echo -ehoặc printfvới \\ndòng mới.

Ví dụ (với echo -e):

$ grep -C1 --group-separator="$(echo -e line1\\n\\nline2)" 'hello' a
hello
this is me
line1
line2
something else
hello hello
bye

Ví dụ (với printf):

$ grep -C1 --group-separator="$(printf hello\\nfedorqui)" 'hello' a
hello
this is me
hello

fedorqui
something else
hello hello
bye

Một lợi thế là chúng tôi đang sử dụng báo giá kép . (do đó mở rộng biến, vv làm việc)


Tôi không nghĩ rằng nó là cần thiết để sử dụng printfhoặc echo. Trong trường hợp của bạn, grep -C1 --group-separator=$'hello\nfedorqui' 'hello' alà tương đương.
fedorqui

@fedorqui vâng, để tôi xóa câu trả lời thừa của tôi!
Pandya

Tuy nhiên, cảm ơn vì nỗ lực, nếu tôi không tìm thấy $''bạn sẽ là cách tốt để đi!
fedorqui

@fedorqui Btw, tôi thấy thất bại với $'$var'(không thể mở rộng / in giá trị của biến nếu được đặt bằng một trích dẫn!) phải không? trong khi "$(echo $var)"có thể làm việc
Pandya

Vâng, điều này là đúng. Nhưng bạn có thể nói $'"$var"'. Đó là $'+ "$var"+ '.
fedorqui
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.