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\\"
grep
regular-expression
Tom Medley
quelle
quelle
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:
Hier hat der Befehl zwei Argumente mit Wert erhalten
foo\bar
, die unverändert auf dem Terminal wiedergegeben wurden.(Oben habe ich
printf
anstelle vonecho
möglichst vielenecho
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:oder äquivalent:
(Beide Zeilen weisen die Shell an,
foo\\bar
als Argument an zu sendengrep
.)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"…"
.quelle
Sie können auch verwenden
fgrep
(was nurgrep
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.quelle
..\
und selbst mit ihm habe'..\\'
ich nicht die gewünschten Ergebnisse erzielt.grep -F '..\'
hol mir was ich wollte! Vielen Dankgrep
erfordert vier Backslashes, um einen Backslash darzustellen:quelle
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
.