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.

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

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)


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.