![Verwenden von grep zum Filtern von Ordnern mit Zahlen](https://rvso.com/image/1618326/Verwenden%20von%20grep%20zum%20Filtern%20von%20Ordnern%20mit%20Zahlen.png)
Ich habe versucht, nur Ordner mit Zahlen aufzulisten und einls -1
(Option -1
isteine Datei pro Zeile auflisten) über grep (ich weiß, dass find das auch kann, aber in diesem Beispiel möchte ich bei grep bleiben)
Ordner sind
PC:test user$ ls -1
1184
36
69929
7
9907
Das hier ist, was ich mit den verschiedenen Ausgaben bekomme …
Dieses hier: Ich verstehe nicht, warum 9907 dort drin ist, da es irgendwie Sinn machte, dass nur der Ordner mit der einstelligen 7 dort drin ist?
PC:test user$ ls -1 | grep [0-9]
7
9907
Hier fehlt 7. Bedeutet das .
2 oder mehr?
PC:test user$ ls -1 | grep [0-9].
1184
36
69929
9907
Bedeutet dies, dass alles mit einer Zahl abgeglichen wird?
PC:test user$ ls -1 | grep [0-9].*
1184
36
69929
7
9907
In Anführungszeichen funktioniert es wie erwartet, also warum? Ist es das Äquivalent zu [0-9].*
?
PC:test user$ ls -1 | grep '[0-9]'
1184
36
69929
7
9907
Antwort1
„Dateinamensubstitution“ oder „Pfadnamenerweiterung“ oder „Globbing“
Wenn Sie einen Befehl eingeben, durchläuft dieser mehrere Stufen möglicher TransformationVorein beliebiges Programm (z. B. grep) wird aufgerufen.
[
ist in einigen Shells ein Sonderzeichen.
$ echo [0-9]
7
Ich denke, dass hier Folgendes passiert: Die Shell erweitert 0-9 als Dateinamenauswahl und findet Ihre Datei „7“ und übergibt daher „7“ an grep. Daher sucht grep nach Dateinamen, die irgendwo im Dateinamen eine „7“ enthalten.
Wenn Sie [
von grep und nicht von der Shell verarbeitet werden möchten, müssen Sie die Zeichenfolge in Anführungszeichen setzen oder die Shell dazu austricksen, den Ausdruck anders zu analysieren.
$ echo [0-9].
[0-9].
Zitieren wird empfohlen.
Siehe auch man bash
(suchen Sie nach for
) man test
und Seite 151 vonDas
Reguläre Ausdrücke
In einem regulären Ausdruck .
bedeutet „jedes einzelne Zeichen“. Also [0-9].
jede Ziffer, gefolgt von einem einzelnen Zeichen. 7
Letzteres fehlt im Dateinamen.
Wenn Sie möchten, dass grep einstellige Dateinamen findet, müssen Sie Ihren Ausdruck sowohl am Anfang als auch am Ende der Zeile verankern
$ ls -1 | grep '[0-9]'
1184
36
69929
7
9907
$ ls -1 | grep '^[0-9]$'
7
Ups, ich habe meinen Computer zerstört
Der unvorsichtige Einsatz von Sonderzeichen führt zu allerlei spannenden Ergebnissen
$ ls -1 > x
$ grep *
x:1184
Dies dürfte deutlicher werden, wenn man bedenkt,
$ ls -1
1184
36
69929
7
9907
x
$ echo *
1184 36 69929 7 9907 x
Jetzt müssen Sie nur noch rm
und sudo
hinzufügen und schon können Sie eine Erfahrung machen, die Ihre Karriere dramatisch verändern kann.