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\\"
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\\"
Antworten:
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 printf
anstelle von echo
möglichst vielen echo
Implementierungen auch eine eigene Interpretation von Backslash verwendet (hier würde sich das \b
zu 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\\bar
als 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 "…"
.
Sie können auch verwenden fgrep
(was nur grep
mit der -F
Flagge 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\'
..\
und selbst mit ihm habe '..\\'
ich nicht die gewünschten Ergebnisse erzielt. grep -F '..\'
hol mir was ich wollte! Vielen Dank
grep
erfordert vier Backslashes, um einen Backslash darzustellen:
grep "\\\\resources\\\\"
grep
Es 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.
grep
.
grep '\\resources\\'