Verwenden von grep zum Filtern von Ordnern mit Zahlen

Verwenden von grep zum Filtern von Ordnern mit Zahlen

Ich habe versucht, nur Ordner mit Zahlen aufzulisten und einls -1(Option -1isteine 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 testund 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. 7Letzteres 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 rmund sudohinzufügen und schon können Sie eine Erfahrung machen, die Ihre Karriere dramatisch verändern kann.

verwandte Informationen