Comment utiliser multiligne comme séparateur de groupe dans grep?

8

En grepvous pouvez utiliser --group-separatorpour écrire quelque chose entre les deux matches de groupe.

Cela est pratique pour clarifier les blocs que nous avons, en particulier lorsque vous utilisez l' -C Xoption pour obtenir des lignes de contexte.

$ 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

J'ai appris en utilisant la ligne vide comme contexte "séparateur de groupe" pour grep comment avoir juste une ligne vide, en disant --group-separator="".

Mais que faire si je veux avoir deux lignes vides? J'ai essayé de dire --group-separator="\n\n"mais j'obtiens littéralement \n:

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

D'autres choses comme ça --group-separator="\nhello\n"n'ont pas fonctionné non plus.

fedorqui
la source

Réponses:

12

Ooooh je l'ai trouvé, j'ai juste besoin d'utiliser la $''syntaxe au lieu de $"":

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



something else
hello hello
bye

De man bash:

CITATION

Les mots de la forme $ 'string' sont traités spécialement. Le mot se développe en chaîne, avec des caractères d'échappement antislash remplacés comme spécifié par la norme C ANSI. Les séquences d'échappement de barre oblique inverse, le cas échéant, sont décodées comme suit:

(...)
\n     new line
fedorqui
la source
1

Je suggère d'utiliser echo -eou printfavec \\npour la nouvelle ligne.

Exemple (avec echo -e):

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

Exemple (avec printf):

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

fedorqui
something else
hello hello
bye

Un avantage est que nous utilisons des guillemets doubles . (d'où expansion variable, etc. travail)

Pandya
la source
Je ne pense pas qu'il soit nécessaire d'utiliser printfou echo. Dans votre cas, grep -C1 --group-separator=$'hello\nfedorqui' 'hello' ac'est équivalent.
fedorqui
@fedorqui oui, permettez-moi de supprimer ma réponse redondante!
Pandya
Merci cependant pour l'effort, si je n'avais pas trouvé le $''vôtre serait le bon chemin à parcourir!
fedorqui
@fedorqui Btw, j'ai trouvé un échec avec $'$var'(impossible de développer / imprimer la valeur de la variable si elle est définie par un guillemet simple!) non? alors que "$(echo $var)"peut fonctionner.
Pandya
Oui c'est bien cela. Mais vous pouvez alors dire $'"$var"'. C'est $'+ "$var"+ '.
fedorqui