Como usar multiline como separador de grupo no grep?

8

Em grepvocê pode usar --group-separatorpara escrever algo entre as correspondências do grupo.

Isso é útil para esclarecer quais blocos temos, especialmente ao usar a -C Xopção para obter 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

Aprendi em Usando a linha vazia como contexto "separador de grupo" para grep como ter apenas uma linha vazia, dizendo --group-separator="".

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

$ 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.

fedorqui
fonte

Respostas:

12

Ooooh eu encontrei, 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:

CITAÇÕES

Palavras da forma $ 'string' são tratadas especialmente. A palavra se expande para string, com caracteres de escape com barra invertida substituídos conforme especificado pelo padrão ANSI C. Seqüências de escape de barra invertida, se presentes, são decodificadas da seguinte maneira:

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

Sugiro usar echo -eou printfcom \\npara 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 . (daí a expansão variável, etc. funciona)

Pandya
fonte
Eu não acho que é necessário usar printfou echo. No seu caso, grep -C1 --group-separator=$'hello\nfedorqui' 'hello' aé equivalente.
Fedorqui
@fedorqui sim, deixe-me excluir minha resposta redundante!
Pandya
Obrigado, no entanto, pelo esforço, se eu não tivesse encontrado o $''seu seria o melhor caminho a percorrer!
Fedorqui
@fedorqui Btw, eu encontrei uma falha com $'$var'(incapaz de expandir / imprimir o valor da variável se definida por aspas simples!), certo? enquanto "$(echo $var)"pode funcionar.
Pandya
Sim, está certo. Mas você pode dizer $'"$var"'. Isso é $'+ "$var"+ '.
Fedorqui