Wie verwende ich Multiline als Gruppentrennzeichen in grep?

8

In können grepSie verwenden --group-separator, um etwas zwischen Gruppenspielen zu schreiben.

Dies ist praktisch, um zu verdeutlichen, welche Blöcke wir haben, insbesondere wenn Sie die -C XOption zum Abrufen von Kontextzeilen verwenden.

$ 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

Ich habe in Verwenden einer leeren Zeile als Kontext "Gruppentrennzeichen" für grep gelernt, wie man nur eine leere Zeile hat, indem ich sagte --group-separator="".

Was ist jedoch, wenn ich zwei leere Zeilen haben möchte? Ich habe versucht zu sagen, --group-separator="\n\n"aber ich bekomme wörtliche \ns:

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

Andere Dinge wie haben --group-separator="\nhello\n"auch nicht funktioniert.

fedorqui
quelle

Antworten:

12

Ooooh, ich habe es gefunden, ich muss nur die $''Syntax verwenden anstatt $"":

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



something else
hello hello
bye

Von man bash:

ZITAT

Wörter der Form $ 'string' werden speziell behandelt. Das Wort wird zu Zeichenfolge erweitert, wobei Zeichen mit umgekehrten Schrägstrichen ersetzt werden, wie im ANSI C-Standard angegeben. Backslash-Escape-Sequenzen werden, falls vorhanden, wie folgt dekodiert:

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

Ich schlage vor, echo -eoder printfmit \\nfür neue Linie zu verwenden.

Beispiel (mit echo -e):

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

Beispiel (mit printf):

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

fedorqui
something else
hello hello
bye

Ein Vorteil ist, dass wir doppelte Anführungszeichen verwenden . (daher variable Expansion usw. funktionieren)

Pandya
quelle
Ich denke nicht, dass es notwendig ist, printfoder zu verwenden echo. In Ihrem Fall grep -C1 --group-separator=$'hello\nfedorqui' 'hello' aist gleichwertig.
Fedorqui
@fedorqui ja, lass mich meine überflüssige Antwort löschen!
Pandya
Vielen Dank jedoch für die Mühe, wenn ich nicht gefunden $''hätte, dass Ihre der gute Weg wäre!
Fedorqui
@fedorqui Übrigens, ich habe einen Fehler gefunden mit $'$var'(Wert der Variablen kann nicht erweitert / gedruckt werden, wenn er in einfachen Anführungszeichen gesetzt wird!), oder? während "$(echo $var)"kann funktionieren.
Pandya
Ja das ist richtig. Aber das kann man dann sagen $'"$var"'. Das ist $'+ "$var"+ '.
Fedorqui