Reguläre Ausdrücke VS Filename Globbing


15

Ich weiß, dass reguläre Ausdrücke nur mit Zeichen und Zeichenfolgen verwendet werden dürfen, aber manchmal finde ich sie in den Namen von Dateien. Meine Frage ist: Werden reguläre Ausdrücke nur mit Zeichen oder auch mit Dateinamen verwendet?

Antworten:


19

Reguläre Ausdrücke und das Verschieben von Dateinamen sind zwei sehr unterschiedliche Dinge.

Reguläre Ausdrücke werden in Befehlen / Funktionen für den Mustervergleich im Text verwendet. Zum Beispiel im Musterparameter von grepoder in Programmiersprachen.

Das Verschieben von Dateinamen wird von Shells zum Abgleichen von Datei- und Verzeichnisnamen mithilfe von Platzhaltern verwendet. Die Möglichkeiten des Globbing hängen von der Shell ab. Bash unterstützt beispielsweise Platzhalter wie:

  • * stimmen mit 0 oder mehr Zeichen überein
  • ? Stimmt mit 1 Zeichen überein
  • [...] stimmen mit einem Zeichen im angegebenen Satz überein

Diese Platzhalter sehen möglicherweise wie reguläre Ausdrücke aus und haben in der Tat [...]dieselbe Bedeutung für Globbing und Regex. Aber *und ?meine verschiedene Dinge in Globbing und Regex.

In einem Kommentar schriebst du:

aber wie unterscheidet sich der Interpreter * ob es ein Joker oder ein Regex ist? zum Beispiel grep a*b a*.txt:?

Einfach. Art von.

Zunächst versucht die Shell, die Platzhalter zu interpretieren, indem sie sie mit den Dateinamen abgleichen. Wenn Dateien vorhanden sind, die mit "a" beginnen und mit "b" enden, wird die Shell durch a*bdie entsprechenden Dateinamen ersetzt. Gleiches gilt für a*.txt. Wenn es keine übereinstimmenden Dateinamen gibt, übergibt die Shell die Argumente so, grepwie sie waren.

Der erste Parameter von grepsollte jedoch ein Muster sein. In 99,999% der praktischen Anwendungsfälle möchten Sie nicht, dass der erste Parameter von der Shell interpretiert wird. Die Absicht war also höchstwahrscheinlich:

grep "a*b" a*.txt

Dank der Anführungszeichen a*binterpretiert die Shell sie nicht mit Globbing, sondern übergibt sie direkt an grep. grepWird dies wiederum als regulären Ausdruck interpretieren (beabsichtigt).

Zusammenfassend lässt sich sagen, dass die Shell die Befehlszeile nach ihrer eigenen globalen Sprache interpretiert, in der Platzhalter verwendet werden. Befehle, Programme interpretieren ihre Parameter so, wie sie von ihren Autoren entworfen wurden.


4

Wenn ein Dateiname eine Zeichenfolge für Sie ist, können Sie Regex auch für Dateinamen verwenden. Zum Beispiel: Wenn Sie nach Dateinamen suchen möchten, die mit einem regulären Ausdruck übereinstimmen, können Sie versuchen:

find ./ -regex '.*[abc][xyz].*'

Der Befehl sucht nach Dateien, deren Name a, b oder c gefolgt von x, y oder z enthält. Dies ist nur ein Beispiel. Es gibt unendlich viele Möglichkeiten.


aber wie unterscheidet sich der Interpreter * ob es ein Joker oder ein Regex ist? Zum Beispiel: $ grep a "asterix" b a "asterix" .txt
Hamza

2
Wenn Sie verwenden, verwenden find ./ -name 'a*'Sie * als Platzhalter. Wenn Sie tippen find ./ -regex 'a*', verwenden Sie * in einem regulären Ausdruck. Der wichtige Unterschied ist der Schalter -nameoder -regex.
Niemand
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.