Come usare multiline come separatore di gruppi in grep?


8

In greppuoi usare --group-separatorper scrivere qualcosa tra le partite di gruppo.

Questo è utile per chiarire quali blocchi abbiamo, soprattutto quando si utilizza l' -C Xopzione per ottenere le linee di contesto.

$ 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

Ho imparato in Usare la linea vuota come "separatore di gruppi" di contesto per grep come avere una linea vuota, dicendo --group-separator="".

Tuttavia, se volessi avere due righe vuote? Ho provato a dire --group-separator="\n\n"ma ottengo letteralmente \ns:

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

Anche altre cose come --group-separator="\nhello\n"non hanno funzionato.

Risposte:


12

Ooooh l'ho trovato, ho solo bisogno di usare la $''sintassi invece di $"":

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



something else
hello hello
bye

Da man bash:

PREVENTIVAZIONE

Le parole del modulo $ 'stringa' sono trattate in modo speciale. La parola si espande in stringa, con i caratteri con escape backslash sostituiti come specificato dallo standard ANSI C. Le sequenze di escape barra rovesciata, se presenti, sono decodificate come segue:

(...)
\n     new line

1

Suggerisco di usare echo -eo printfcon \\nper la nuova riga.

Esempio (con echo -e):

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

Esempio (con printf):

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

fedorqui
something else
hello hello
bye

Un vantaggio è che stiamo usando una doppia citazione . (quindi espansione variabile, ecc. lavoro)


Non penso sia necessario usare printfo echo. Nel tuo caso, grep -C1 --group-separator=$'hello\nfedorqui' 'hello' aè equivalente.
fedorqui,

@fedorqui sì, lasciami eliminare la mia risposta ridondante!
Pandya,

Grazie comunque per lo sforzo, se non avessi trovato la $''tua sarebbe la buona strada da percorrere!
fedorqui,

@fedorqui A proposito, ho trovato un errore con $'$var'(impossibile espandere / stampare il valore della variabile se impostato da una virgoletta singola!) giusto? mentre "$(echo $var)"può funzionare.
Pandya,

Sì, è giusto Ma poi puoi dire $'"$var"'. Questo è $'+ "$var"+ '.
fedorqui,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.