
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 grep
Vorgänge wie folgt kombinieren:
grep '^*\*' test.out | grep ')$'
Oder mit einem einzigen grep
Befehl 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 dash
stattdessen 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.