Ich muss herausfinden, ob Zeilen in einer Datei mit beginnen **
.
Ich kann nicht herausfinden, wie es geht, da *
es von der Shell als Platzhalter interpretiert wird.
grep -i "^2" test.out
funktioniert wenn die Zeile mit einer 2 aber beginnt
grep -i "^**" test.out
funktioniert offensichtlich nicht.
(Ich muss auch wissen, ob diese Zeile mit einem endet )
, habe das aber noch nicht versucht).
text-processing
grep
quoting
Shar Hunter
quelle
quelle
*
muss in diesem speziellen Fall nicht entkommen, fwiw.grep "^\\*\\*"
damit grep die^\*\*
Zeichenfolge erhält, die erforderlich ist, um zu vermeiden, dass die Sternchen als Regex-Quantifizierer interpretiert werden.Da Sie die Zeile überprüfen möchten, die mit beginnt
**
und mit endet)
, können Sie zweigrep
Operationen wie folgt kombinieren :Oder mit einem einzigen
grep
Befehl wie diesem,Erläuterung
^\*\*
: Übereinstimmungslinie, die mit beginnt**
.*
: alles nachher zusammenbringen**
\)$
: Übereinstimmungszeile, die auch)
am Zeilenende steht.quelle
Es ist nicht die Hülle
Keine der bisherigen Antworten hat das eigentliche Problem berührt. Es wäre hilfreich zu erklären, warum es nicht wie erwartet funktioniert.
grep -i "^**" test.out
Da Sie das Muster zu grep zitiert haben , wird es von der Shell nicht erweitert. Es wird so wie es ist an grep übergeben . Dies wird auf der Handbuchseite [1] für Bash [2] erläutert :
*
Es sind reguläre gewöhnliche reguläre Ausdrücke
Ein regulärer Ausdruck ist ein Muster , das eine Reihe von Zeichenfolgen beschreibt.
*
ist eines der Schlüsselmuster in regulären Ausdrücken. Standardmäßig interpretiert grep es wie folgt:Dies bedeutet, dass Ihr Muster in seiner jetzigen
^**
Form nicht viel Sinn macht. Möglicherweise wird zweimal versucht, den Zeilenanfang null oder mehrmals anzupassen. Was auch immer das heißt.Die Lösung besteht darin, es zu zitieren :
grep -i "^\*\*" test.out
[1] Ich empfehle nicht, es zu lesen. Bitte verwenden Sie
man dash
stattdessen oder ähnliches.[2] Es wurde keine Shell gegeben, daher gehe ich von Bash aus .
quelle
Andere Optionen.
Sie können
sed
oderawk
auch verwendenUm zu wissen , Linien , dass Ende mit
)
Verwendung auchgrep
odersed
oderawk
quelle
'/^*\*/&&/)$/'
...Dies ist die völlig unzitierte Version :
grep ^\\*\\* test.out
. Um einen wörtlichen Backslash von der Shell an grep zu übergeben, muss dieser maskiert werden.Dies funktioniert, solange Sie keine Dateien im Verzeichnis haben, die mit
^\
einem anderen Backslash beginnen und diesen enthalten.quelle