Wann wird in grep ein einfaches Anführungszeichen oder ein doppeltes Anführungszeichen verwendet?


20

Beim Versuch, nach einem einfachen Muster "Hallo" in einer Datei zu suchen, funktionieren alle folgenden Formen von grep:

  • grep hallo file1
  • grep 'Hallo' file1
  • grep "hallo" file1

Gibt es einen bestimmten Fall, in dem eine der oben genannten Formen funktioniert, andere jedoch nicht. Macht es einen Unterschied, ob ich eines anstelle eines anderen verwende?

Antworten:


25

Dies ist tatsächlich abhängig von Ihrer Shell. Anführungszeichen (egal welcher Art) sollen sich hauptsächlich mit Leerzeichen befassen. Zum Beispiel das Folgende:

grep hello world file1

sucht nach dem Wort "Hallo" in Dateien mit den Namen "Welt" und "Datei1", während

grep "hello world" file1

Sucht in Datei1 nach "Hallo Welt".

Die Wahl zwischen einfachen oder doppelten Anführungszeichen ist nur wichtig, wenn die Suchzeichenfolge Variablen oder andere Elemente enthält, deren Auswertung Sie erwarten. Bei einfachen Anführungszeichen wird die Zeichenfolge wörtlich genommen und es findet keine Erweiterung statt. Mit doppelten Anführungszeichen werden Variablen erweitert. Zum Beispiel (mit einer von Bourne abgeleiteten Shell wie Bash oder ZSH):

VAR="serverfault"
grep '$VAR' file1
grep "$VAR" file1

Die erste grepsucht nach der Literalzeichenfolge "$ VAR1" in Datei1. Die zweite Option erweitert die Variable "$ VAR" und sucht in Datei1 nach der Zeichenfolge "serverfault".


Das Wichtigste ist, dass grep in der ursprünglichen Frage jedes Mal genau die gleichen Argumente erhält.
MikeyB

2
Sei dort vorsichtig. $steht in einem regulären Ausdruck am Ende der Zeile und $VAR1sollte daher niemals mit etwas übereinstimmen. Es funktioniert zwar mit GNU grep, aber ich würde trotzdem nicht mit diesem Verhalten rechnen. Sie müssen \$VAR1die Literalzeichenfolge sicher zuordnen. (Und Sie würden zusätzliche Backslashes benötigen, wenn das in doppelten Anführungszeichen steht.)
Steven Pritchard

7

James ist richtig, aber um einige weitere Daten hinzuzufügen, denke ich, dass die beste Möglichkeit ist, sie als Argumente für den Befehl zu betrachten: Beabsichtigen Sie, dass "Hallo" und "Welt" zwei Argumente sind, oder dass "Hallo Welt" eines ist? Streit.

Doppelte Anführungszeichen ermöglichen auch die Interpretation von mehr als nur Variablen. Genau das, was von Ihrer Shell abhängt, aber prüfen Sie die Verlaufserweiterung, Klammererweiterung und Dateinamenerweiterung.

Es ist auch wichtig zu beachten, dass es einige Fälle gibt, in denen Sie beide Arten von Anführungszeichen in einem einzigen Argument verwenden müssen. Denken Sie daran, dass (standardmäßig) Argumente durch Leerzeichen begrenzt sind. Wenn Sie also kein Leerzeichen lassen, geben Sie immer noch dasselbe Argument an.

Der Singlequote-Mechanismus der meisten Shells lässt keine Sonderzeichen zu, was bedeutet, dass jede Instanz eines anderen Singlequote, auch wenn es als maskiert erscheint, das Anführungszeichen beendet. Es ist daher nicht möglich, eine Zeichenfolge mit einem einfachen Anführungszeichen in einer Zeichenfolge mit einem einfachen Anführungszeichen zu übergeben, und Sie müssen doppelte Anführungszeichen verwenden. Dies kann schwierig sein, wenn Sie ein Argument übergeben möchten, das einfache Anführungszeichen und etwas enthält, das interpretiert werden würde, das Sie aber nicht wollen. Wenn Sie beispielsweise die Literalzeichenfolge "$ VAR ist eine Variable" übergeben möchten, müssen Sie dies folgendermaßen tun:

"'"'$VAR'"' is a variable"

Das ist eigentlich eine Verkettung von drei mit Anführungszeichen versehenen Zeichenfolgen:

"'"
'$VAR'
"' is a variable"

oder mit entfernten Anführungszeichen:

'
$VAR
' is a variable

Eigentlich könnte man es mit den meisten Shells auch so machen:

"'\$VAR' is a variable"

Dabei \weist der Backslash (" ") die Shell an, das folgende Zeichen wörtlich zu akzeptieren und es nicht zu erweitern.

Aber es gibt einige Fälle, in denen Sie es auf die Weise der Multi-String-Verkettung machen müssen, nicht dass ich mir gerade ein Beispiel einfallen lassen kann.

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.