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 .


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 "…".


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\'

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\\\\"

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,
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.