Wie wird \ $ von grep interpretiert?

10712
Happy Mittal

Wenn ich schreibe

$ grep \$ 

Was auch immer ich am Terminal eingebe, wird abgeglichen und auf das Terminal gedruckt. Wie wird \$es interpretiert?

12

5 Antworten auf die Frage

18

Die Shell interpretiert das \$und leitet es an grep as als $Zeilenende-Zeichen weiter. Wenn Sie davon ausgehen, dass Ihre Zeile ein Ende hat, wird sie übereinstimmen :-)

Wenn Sie ein aktuelles $Ergebnis in grep abgleichen möchten, verwenden Sie eine der folgenden Optionen:

grep \\\$ grep '\$' 

Im ersteren, interpretiert die Schale \\wie \und \$wie $, was \$. Im letzteren wird es überhaupt nicht interpretiert.


Was Ihre Frage anbelangt, weshalb \$das Dollarzeichen eher der zweistelligen Sequenz entspricht, verwenden reguläre Ausdrücke, wie sie beispielsweise grepverwendet werden, Sonderzeichen für bestimmte Zwecke. Einige davon sind:

$ end of line ^ start of line . any character + 1 or more of the preceeding pattern * 0 or more of the preceeding pattern between n and m of the preceeding pattern [x-y] any character between x and y (such as [0-9] for a digit). 

zusammen mit vielen anderen.

Wenn Sie ein Literla-Zeichen zuordnen möchten, das normalerweise als Sonderzeichen behandelt wird, müssen Sie es entziehen, damit grepes als normales Zeichen behandelt wird.

Um zu testen, was grep sieht, probieren Sie `echo \ $` und dann `echo \\ $` vor 14 Jahren 1
In grep \\\ $ wird, wie Sie sagten, \ $ an grep übergeben, also sollte es mit Zeichenfolgen übereinstimmen, die \ $ enthalten, aber warum stimmt es mit den Zeichenfolgen überein, die nur ein $ enthalten? vor 14 Jahren 0
Weil $ in grep ein Zeilenende bedeutet. Um mit dem Zeichen $ übereinzustimmen, müssen Sie es entkommen, damit grep es nicht speziell behandelt. Siehe mein Update. vor 14 Jahren 0
@Pasi: echo macht sein eigenes Escape-Verhalten, je nachdem, ob es sich um eine eingebaute Shell handelt oder nicht, POSIX-konform oder nicht usw. Besser ist es (IMHO), 'ls \ $' zu verwenden und zu sehen, dass wir "ls: $: Nein" erhalten Datei oder Verzeichnis ", um zu sehen, dass \ $ nicht in $, aber \\ $ in \ $ und nicht in eine Richtung umgeleitet wird. Henno vor 13 Jahren 0
5
Nick Meyer

Die Shell dehnt zunächst alle Escape-Sequenzen aus, bevor die Argumente an das Programm übergeben werden. Daher interpretiert sie die \$Escape-Sequenz und gibt das einzige Argument $an grep, das dem Zeilenende entspricht. Da jede Zeile ein Ende hat, sollte jede Zeile übereinstimmen :)

Aber wie ist $ am Zeilenende? Ist das Zeilenende nicht \ n? vor 14 Jahren 0
@Happy Mithal: Siehe "man grep"; Es wurde entschieden, dass "$" mit dem Zeilenende übereinstimmt, unabhängig davon, ob die Zeilen durch "\ n", "\ r" oder beides getrennt sind oder nicht. Im allgemeinen Fall können reguläre Ausdrücke verwendet werden, um einen beliebigen String und nicht nur eine "Zeile" abzugleichen, und "$" wird verwendet, um das Ende des Strings abzugleichen. vor 14 Jahren 2
2

Es wird als End-of-Line-Metazeichen interpretiert. Wenn Sie ein tatsächliches Dollarzeichen zuordnen möchten, tun Sie dies

 $ grep \\$ 

oder

 $ grep '\$' 
1
N 1.1

^ist für den Anfang der Zeichenfolge und $für das Ende.

grep \$ 

oder

grep $ 

wird mit jeder Zeichenfolge übereinstimmen, sodass alles, was Sie eingeben, zurückgegeben wird.

Versuchen

grep a$ 

Nun, nur Strings, deren letzte Zeichen awird angepasst und Echo werden .

1
user31894

Wenn Sie nach einem Literal suchen möchten, können Sie sich den Aufwand für die Escape-Funktion sparen $, indem Sie den regulären Ausdruck für die Zeichenklasse verwenden. Zum Beispiel,

$ grep '[$]' file