So finden Sie Zeilen, die mit ** beginnen

So finden Sie Zeilen, die mit ** beginnen

Ich muss herausfinden, ob Zeilen in einer Datei mit beginnen **.

Ich kann nicht herausfinden, wie das geht, da *es von der Shell als Platzhalter interpretiert wird.

grep -i "^2" test.out

funktioniert, wenn die Zeile mit einer 2 beginnt, aber

grep -i "^**" test.out 

funktioniert offensichtlich nicht.

(Ich muss auch wissen, ob diese Zeile mit einem endet, )habe das aber noch nicht versucht).

Antwort1

Verwenden Sie das \Zeichen, um dem * zu entkommen und es in ein normales Zeichen umzuwandeln.

grep '^\*\*' test.out

Beachten Sie auch die einfachen Anführungszeichen 'und nicht die doppelten Anführungszeichen ", um zu verhindern, dass die Shell Dinge erweitert

Antwort2

Da Sie die Zeile überprüfen möchten, die mit beginnt **und endet ), können Sie zwei grepVorgänge wie folgt kombinieren:

grep '^*\*' test.out | grep ')$'

Oder mit einem einzigen grepBefehl wie diesem,

grep -E '^\*\*.*\)$' test.out

Erläuterung

  • ^\*\*: Übereinstimmungszeile, die beginnt mit**
  • .*: passt zu allem nach**
  • \)$: Zeile übereinstimmen, die auch )am Zeilenende steht.

Antwort3

Es ist nicht die Schale

Keine der Antworten hat bisher das eigentliche Problem angesprochen. Es wäre hilfreich zu erklärenWarumes funktioniert nicht wie erwartet.

grep -i "^**" test.out

Weil du hastzitiertdas Muster zugrep, *Istnichtvon der Shell erweitert. Es wird weitergegeben angrepwie sie sind. Dies wird in der Manualpage [1] fürSchlag[2] :

Durch das Einschließen von Zeichen in doppelte Anführungszeichen bleibt der Literalwert aller Zeichen innerhalb der Anführungszeichen erhalten, mit Ausnahme von $, `, \ und (wenn die Verlaufserweiterung aktiviert ist) !.

Es sind normale, gewöhnliche reguläre Ausdrücke

Ein regulärer Ausdruck ist einMusterdas eine Reihe von Zeichenfolgen beschreibt.

*ist eines der wichtigsten Muster in regulären Ausdrücken. Standardmäßiggrepinterpretiert es wie folgt:

* The preceding item will be matched zero or more times.

Das bedeutet, dass Ihr Muster in seiner jetzigen Form ^**nicht viel Sinn ergibt. Möglicherweise versucht es, den Zeilenanfang abzugleichennull oder mehr Mal, zweimal. Was auch immer das bedeutet.

Die Lösung besteht darin,ZitatEs:

Jedes Metazeichen mit besonderer Bedeutung kann durch Voranstellen eines Backslashs zitiert werden.

grep -i "^\*\*" test.out


[1] Ich empfehle nicht, es zu lesen. Bitte verwenden Sie man dashstattdessen oder Ähnliches.

[2] Es wurde keine Shell angegeben, daher nehme ich an,Schlag.

Antwort4

Dies ist die Version völlig ohne Anführungszeichen: grep ^\\*\\* test.out. Um einen wörtlichen Backslash von der Shell an grep zu übergeben, muss er maskiert werden.

Dies funktioniert, solange Sie im Verzeichnis keine Dateien haben, die mit ^\einem anderen Backslash beginnen und diesen enthalten.

verwandte Informationen