Ich wollte den Inhalt eines pwd auflisten und nur Dateien anzeigen, die mit dot beginnen. Ich habe es versucht, ls -a | grep ^\.
aber ich kann nicht herausfinden, warum die Ausgabe auch die Dateien enthält, die nicht mit Punkt beginnen. Beispielsweise:
Pictures
.pip
.pki
.profile
projects
Public
Ich weiß, dass ich erreichen kann, was ich will. ls -ld .*
Ich bin nur neugierig auf dieses Verhalten von grep, das ich nicht erklären kann.
grep
regular-expression
ps-aux
quelle
quelle
ls -d .*
alle Dateien auflisten, die mit beginnen.
?Antworten:
Zitieren Sie das Argument
grep
alsols -a | grep '^\.'
Der Grund dafür ist, dass die Shell sie verarbeitet
\.
und wieder in eine einfache Form umwandelt.
, diegrep
dann als Platzhalter mit einem Zeichen behandelt wird. Geben Sie im Zweifelsfall immer eine Zeichenfolge an, die ein für die Shell spezielles Zeichen enthält (oder enthalten könnte).quelle
grep ^\\.
Fall wird \\ von der Shell als einzelner Backslash behandelt, und der Grep behandelt erneut einen einzelnen Backslash, gefolgt vom Punkt als Literalpunkt.Sie müssen den Grep-Regex in Anführungszeichen setzen.
Hinweis: Analysieren Sie die
ls
Befehlsausgabe nicht .quelle
Wenn Sie cmd ls -a | ausführen grep ^ \. dann betrachte grep "\" nicht als Sonderzeichen und Bedeutung von "." entkomme nicht.
Wenn wir cmd ls -a | verwenden grep "^ \." dann betrachtet grep "\" als Sonderzeichen und Bedeutung von "." wird entkommen. Sie erhalten erwartungsgemäß ein Ergebnis.
Wenn Sie grep cmd ohne Anführungszeichen verwenden möchten, sollten Sie auch das Zeichen "\" maskieren. Sie können das erwartete Ergebnis ohne doppelte Anführungszeichen erzielen, indem Sie den folgenden Befehl ausführen. ls -a | grep ^ \\.
Einzelheiten zur Bedeutung von Sonderzeichen in Regex finden Sie unter folgendem Link. http://www.regular-expressions.info/quickstart.html
quelle