Como usar o multiline como separador de grupo no grep?

6

Em grep , você pode usar --group-separator para escrever algo entre as correspondências de grupo.

Isso é útil para deixar claro quais blocos nós temos, especialmente quando usamos a opção -C X para obter as linhas de contexto.

$ 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

Eu aprendi em Usando linha vazia como contexto "separador de grupo" para grep como ter apenas um vazio linha, dizendo --group-separator="" .

No entanto, e se eu quiser ter duas linhas vazias? Eu tentei dizer --group-separator="\n\n" mas recebo literal \n s:

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

Outras coisas como --group-separator="\nhello\n" também não funcionaram.

    
por fedorqui 16.06.2015 / 11:08

2 respostas

9

Ooooh eu encontrei, eu só preciso usar a sintaxe $'' em vez de $"" :

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



something else
hello hello
bye

De man bash :

QUOTING

Words of the form $'string' are treated specially. The word expands to string, with backslash-escaped characters replaced as specified by the ANSI C standard. Backslash escape sequences, if present, are decoded as follows:

(...)
\n     new line
    
por 16.06.2015 / 11:09
0

Sugiro usar echo -e ou printf com \n para nova linha.

Exemplo (com echo -e ):

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

Exemplo (com printf ):

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

fedorqui
something else
hello hello
bye

Uma vantagem é que estamos usando aspas duplas . (portanto, expansão de variáveis, etc. trabalho)

    
por 16.06.2015 / 11:27