Ich möchte wissen, welche Dateien die Zeichenfolge $Id$ haben.

grep \$Id\$ my_dir/mylist_of_files 

gibt 0 Vorkommen zurück.

Ich habe festgestellt, dass ich

grep \$Id$ my_dir/mylist_of_files

Dann sehe ich, dass die $Id in der Ausgabe farbig ist, dh sie wurde abgeglichen.

Wie könnte ich die übereinstimmen? zweite $ und warum funktioniert „t \$Id\$ nicht.

Es spielt keine Rolle, ob die zweite $ ist das letzte Zeichen oder nicht.

Ich verwende grep 2.9.


Vorher Beim Posten meiner Frage habe ich Google verwendet …

Ich habe eine Antwort gefunden

Um in der Datei test2 nach einem $ (Dollarzeichen) zu suchen, geben Sie Folgendes ein:

grep \\ $ test2

Die Zeichen \\ (doppelter Backslash) sind notwendig, um die Shell zu zwingen, ein \ $ zu übergeben (einzelner Backslash, Dollarzeichen) zum Befehl grep. Das Zeichen \ (einzelner Backslash) weist den Befehl grep an, das folgende Zeichen (in diesem Beispiel das $) als Literalzeichen und nicht als Ausdruckszeichen zu behandeln. Verwenden Sie den Befehl fgrep, um die Notwendigkeit zu vermeiden, Escape-Zeichen wie den Backslash zu verwenden.

, aber ich verstehe nicht, warum grep \$Id funktioniert und warum grep \\$Id\\$ nicht „t.

Ich bin ein bisschen verwirrt …

Antwort

Hier gibt es zwei separate Probleme.

  1. grep verwendet Grundlegende reguläre Ausdrücke (BRE), und $ ist ein Sonderzeichen in BRE „s nur am Ende eines Ausdrucks. Die Folge davon ist, dass die 2 Instanzen von $ in $Id$ nicht gleich sind Das erste ist ein normales Zeichen und das zweite ist ein Anker, der mit dem Zeilenende übereinstimmt. Damit das zweite $ mit einem Literal $ Sie müssen einen Backslash ausführen, dh $Id\$. Das Escaping des ersten $ funktioniert auch: \$Id\$, und ich bevorzuge dies, da es konsistenter aussieht.¹

  2. Hier wirken zwei völlig unabhängige Escape- / Quoting-Mechanismen: Shell-Quoting und Regex-Backslash-Quoting. Das Problem ist, dass viele Zeichen, die reguläre Ausdrücke verwenden, auch für die Shell spezifisch sind. Darüber hinaus ist das Regex-Escape-Zeichen, der Backslash, auch ein Shell-Anführungszeichen. Aus diesem Grund treten häufig Fehler mit doppelten Backslashes auf. Ich empfehle jedoch nicht, Backslashes für Shell-Anführungszeichen zu verwenden, da diese nicht sehr gut lesbar sind.

    Stattdessen ist es am einfachsten, zuerst Ihre zu setzen gesamte Regex in einfachen Anführungszeichen wie in "regex". Das einfache Anführungszeichen ist die stärkste Form des Zitierens in der Shell. Solange Ihr regulärer Ausdruck keine einfachen Anführungszeichen enthält, müssen Sie sich nicht mehr um das Anführungszeichen der Shell kümmern und können sich auf die reine BRE-Syntax konzentrieren.

Wenn Sie dies also wieder auf Ihr ursprüngliches Beispiel anwenden, lassen Sie uns den richtigen regulären Ausdruck (\$Id\$) in einfache Anführungszeichen setzen. Folgendes sollte tun, was Sie wollen:

grep "\$Id\$" my_dir/my_file 

Der Grund, warum \$Id\$ nicht funktioniert, liegt darin, dass nach dem Entfernen des Shell-Zitats (die korrektere Art, Shell zu sagen) Wenn zitiert wird, ist der reguläre Ausdruck, den grep sieht, $Id$. Wie in (1.) erläutert, entspricht dieser reguläre Ausdruck einem Literal $Id nur am Ende einer Zeile, da das erste $ wörtlich ist, während das zweite ein spezielles Ankerzeichen ist.

¹ Beachten Sie auch, dass Sie, wenn Sie jemals zu erweiterten regulären Ausdrücken (ERE) wechseln, z. B. (oder grep -E), das Zeichen $ ist immer etwas Besonderes. In ERE würde $Id$ niemals mit etwas übereinstimmen, da Sie nach dem Ende einer Zeile keine Zeichen haben können, also \$Id\$ wäre der einzige Weg.

Kommentare

  • Um zu vermeiden, dass grep seinen ersten Parameter als regulären Ausdruck interpretiert Sie können auch grep -F '$Id$' ausführen.
  • In meiner Shell (bash 4.3.42) grep '$Id\$' ... und grep \$Id\\$ ... work
  • Und wenn dies ein Befehl in einem Makefile ist, müssen Sie auch die $ mit einer vorhergehenden $: grep '$$Id\$$'. Stapelüberlauf.com / a / 2382810/2097284

Antwort

Zum Suchen nach $Id$ in einer Datei: Sie können Folgendes verwenden: grep "\$id*" filename

Kommentare

  • Das passt zu allem, was mit $id beginnt, also auch $idea, nicht nur $id$ .

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.