grep: Nachgestellter Backslash

23

Ich möchte ein Grep für tun \resources\. Wie mache ich das?

Ich habe es versucht:

grep \resources\
grep \\resources\\
grep "\resources\"
grep "\\resources\\"

Keine dieser Arbeiten .

Tom Medley
quelle
5
Verwenden Sie einfache Anführungszeichen anstelle von doppelten Anführungszeichen, um die Interpretation der Backslashes durch Bash zu vermeiden. grep '\\resources\\'
Paul Tomblin

Antworten:

27

Der Backslash ist für viele Anwendungen ein Sonderzeichen:

  • einschließlich der Shell: Sie müssen es mit einem anderen Backslash oder eleganter, wenn möglich mit einfachen Anführungszeichen, umgehen:

    $ printf '%s\n' foo\\bar 'foo\bar'
    foo\bar
    foo\bar
    

    Hier hat der Befehl zwei Argumente mit Wert erhalten foo\bar, die unverändert auf dem Terminal wiedergegeben wurden.

    (Oben habe ich printfanstelle von echomöglichst vielen echoImplementierungen auch eine eigene Interpretation von Backslash verwendet (hier würde sich das \bzu einem Backspace-Zeichen erweitern)).

  • Aber Backslash ist auch ein Sonderzeichen für grep. Dieser Befehl erkennt viele speziellen Sequenzen wie \(, \|, \., und so weiter. In ähnlicher Weise müssen Sie grep \\für einen tatsächlichen Backslash-Charakter mit einem Double füttern . Dies bedeutet, dass Sie unter Verwendung der Shell Folgendes eingeben müssen:

    grep 'foo\\bar'
    

    oder äquivalent:

    grep foo\\\\bar
    

    (Beide Zeilen weisen die Shell an, foo\\barals Argument an zu senden grep.)

  • Viele andere Befehle interpretieren Backslashes in einigen ihrer Argumente ... und es sind zwei Escape-Ebenen erforderlich (eine, um sich der Shell-Interpretation zu entziehen, eine, um sich der Befehlsinterpretation zu entziehen).


Übrigens, für die Shell '…'verhindern einfache Anführungszeichen jede Art von Zeicheninterpretation, doppelte Anführungszeichen verhindern jedoch nur einige von ihnen, insbesondere $, `und \bleiben aktive Zeichen "…".

Stéphane Gimenez
quelle
18

Sie können auch verwenden fgrep(was nur grepmit der -FFlagge ist). Dadurch wird grep gezwungen, das Muster als feste Zeichenfolge zu interpretieren (dh es wird ein \als Literal behandelt \). Sie müssen die Backslashes weiterhin vor der Expansion durch die Shell schützen.

grep -F '\resources\'
mills013
quelle
Die Flagge ist nicht ohne Grund da! Ich habe versucht, danach zu greifen, ..\und selbst mit ihm habe '..\\'ich nicht die gewünschten Ergebnisse erzielt. grep -F '..\'hol mir was ich wollte! Vielen Dank
FreeSoftwareServers
.. Versuchen Sie, diesen Kommentar richtig zu formatieren! -> meta.stackexchange.com/questions/201663/…
FreeSoftwareServers
3

greperfordert vier Backslashes, um einen Backslash darzustellen:

grep "\\\\resources\\\\"
Tom Medley
quelle
12
Dies ist eine etwas irreführende Vereinfachung. grepEs ist nur 1 Backslash erforderlich, um einen weiteren Backslash zu umgehen. Für die Shell müssen jedoch auch Backslashes in Anführungszeichen gesetzt werden. Doppelte Anführungszeichen ( ") zitieren KEINE umgekehrten Schrägstriche, aber umgekehrte Schrägstriche, weshalb die doppelten Anführungszeichen in Ihrem Beispiel nichts bewirken und stattdessen die vier umgekehrten Schrägstriche benötigt werden.
Jw013
Ich musste in Windows vier Backslashes verwenden, obwohl die Windows-Eingabeaufforderung Backslashes nicht wie * nix behandelt. Ich frage mich, ob die GnuWin- Ports den Effekt der Shell missverstanden und eine 4-Schrägstrich-Anforderung hartcodiert haben, weil sie dachten, es sei das, was von gefordert wurde grep.
Synetech,