Bagaimana cara menggunakan multiline sebagai pemisah-kelompok di grep?

8

Di dalamnya grepAnda dapat menggunakan --group-separatoruntuk menulis sesuatu di antara pertandingan grup.

Ini berguna untuk memperjelas blok apa yang kita miliki, terutama ketika menggunakan -C Xopsi untuk mendapatkan garis konteks.

$ 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

Saya belajar menggunakan baris kosong sebagai konteks "pemisah-kelompok" untuk memahami bagaimana hanya memiliki baris kosong, dengan mengatakan --group-separator="".

Namun, bagaimana jika saya ingin memiliki dua baris kosong? Saya mencoba mengatakan --group-separator="\n\n"tetapi saya mendapatkan literal \ns:

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

Hal-hal lain seperti --group-separator="\nhello\n"tidak berhasil juga.

fedorqui
sumber

Jawaban:

12

Ooooh saya menemukannya, saya hanya perlu menggunakan $''sintaks daripada $"":

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



something else
hello hello
bye

Dari man bash:

Mengutip

Kata-kata dalam bentuk $ 'string' diperlakukan secara khusus. Kata diperluas ke string, dengan karakter backslash-escaped diganti sebagaimana ditentukan oleh standar ANSI C. Urutan backslash escape, jika ada, diterjemahkan sebagai berikut:

(...)
\n     new line
fedorqui
sumber
1

Saya sarankan untuk menggunakan echo -eatau printfdengan \\nuntuk baris baru.

Contoh (dengan echo -e):

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

Contoh (dengan printf):

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

fedorqui
something else
hello hello
bye

Salah satu keuntungannya adalah kami menggunakan penawaran ganda . (karenanya ekspansi variabel, dll. bekerja)

Pandya
sumber
Saya rasa tidak perlu menggunakan printfatau echo. Dalam kasus Anda, grep -C1 --group-separator=$'hello\nfedorqui' 'hello' aini setara.
fedorqui
@fedorqui ya, izinkan saya menghapus jawaban saya yang berlebihan!
Pandya
Namun terima kasih atas usahanya, jika saya tidak menemukan $''milik Anda akan menjadi cara yang baik untuk pergi!
fedorqui
@ fedorqui Btw, saya menemukan kegagalan dengan $'$var'(tidak dapat memperluas / mencetak nilai variabel jika ditetapkan dengan kutipan tunggal!) kan? sedangkan "$(echo $var)"bisa bekerja.
Pandya
Ya ini benar. Tapi Anda bisa mengatakannya $'"$var"'. Itu $'+ "$var"+ '.
fedorqui