Wie wird \ $ von grep interpretiert?


Antworten:


18

Die Shell interpretiert das Zeichen \$und übergibt es an grep als $Zeilenendezeichen. Vorausgesetzt also, Ihre Leitung hat ein Ende, wird es passen :-)

Wenn Sie eine tatsächliche $in grep abgleichen möchten , verwenden Sie eine der folgenden Optionen:

grep \\\$
grep '\$'

Im ersteren interpretiert die Shell \\als \und \$als $Geben \$. In letzterem interpretiert es es überhaupt nicht.


Was Ihre Frage betrifft, warum \$das Dollarzeichen und nicht die zweistellige Sequenz übereinstimmt, verwenden reguläre Ausdrücke, wie sie in grepmanchen Fällen verwendet werden, Sonderzeichen. 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
{n,m}   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 maskieren, damit grepes als normales Zeichen behandelt wird.


1
um zu testen, was grep sieht, versuchen Sie echo \$und dannecho \\$

In grep \\\ $ wird, wie Sie sagten, \ $ an grep übergeben, damit es mit Zeichenfolgen übereinstimmt, die \ $ enthalten. Warum stimmt es jedoch mit Zeichenfolgen überein, die nur ein $ enthalten?

Weil $ in grep ein Zeilenende bedeutet. Um dem Zeichen $ zu entsprechen, müssen Sie es maskieren, damit grep es nicht speziell behandelt. Siehe mein Update.

@Pasi: echo macht sein eigenes Unescaping, abhängig davon, ob es eine eingebaute Shell ist oder nicht, POSIX-konform oder nicht usw. Besser ist (IMHO) zu verwenden ls \$und zu sehen, dass wir "ls: $: No such file or directory" erhalten. um zu sehen, dass \ $ nicht an $ angehängt ist, aber \\ $ nicht an \ $ angehängt ist und so weiter.
Henno

5

Die Shell erweitert zuerst alle Escape-Sequenzen, bevor die Argumente an das Programm übergeben werden. Daher interpretiert sie die \$als Escape-Sequenz und übergibt das einzelne Argument $an grep, das mit dem Zeilenende übereinstimmt. Da jede Zeile ein Ende hat, sollte jede Zeile übereinstimmen :)


Aber wie ist $ das Zeilenende? Ist das Zeilenende nicht \ n?

2
@ Happy Mithal: Siehe man grep; es wurde beschlossen , dass $das Ende der Zeile übereinstimmt, unabhängig davon , ob die Linien durch getrennt sind \n, \rbeide, oder etwas ganz anderes. Im Allgemeinen können reguläre Ausdrücke verwendet werden, um mit einer beliebigen Zeichenfolge übereinzustimmen, nicht nur mit einer „Zeile“. Sie werden $verwendet, um mit dem Ende der Zeichenfolge übereinzustimmen.

2

Es wird als Zeilenende-Metazeichen interpretiert. Wenn Sie mit einem tatsächlichen Dollarzeichen übereinstimmen möchten, tun Sie Folgendes

 $ grep \\$ 

oder

 $ grep '\$' 

1

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

grep \$

oder

grep $

passt zu jeder Zeichenfolge, sodass alles, was Sie eingeben, zurückgemeldet wird.

Versuchen

grep a$

Jetzt werden nur Zeichenfolgen aabgeglichen und wiedergegeben, deren letztes Zeichen übereinstimmt .


1

Wenn Sie nach einem Literal suchen möchten, können Sie sich das Entkommen ersparen $, indem Sie den regulären Ausdruck für die Zeichenklasse verwenden. Beispielsweise,

$ grep '[$]' file
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.