Antworten:
Globbing von Shell-Dateinamen und reguläre Ausdrücke verwenden einige der gleichen Zeichen und haben ähnliche Zwecke, aber Sie haben Recht, sie sind nicht kompatibel. Das Globbing von Dateinamen ist ein viel weniger leistungsfähiges System.
Im Dateinamen Globbing:
*
bedeutet "null oder mehr Zeichen"
?
bedeutet "irgendein einzelnes Zeichen"
In regulären Ausdrücken müssen Sie jedoch .*
"null oder mehr Zeichen" und .
"ein beliebiges einzelnes Zeichen" bedeuten . A ?
bedeutet in regulären Ausdrücken etwas ganz anderes: null oder eine Instanz des vorhergehenden RE-Elements.
Eckige Klammern ( []
) scheinen in beiden Systemen auf dem System, auf dem ich dies schreibe, gleich zu funktionieren, zumindest in einfachen Fällen. Dazu gehören Dinge wie POSIX-Zeichenklassen (z. B.[:alpha:]
). Das heißt, wenn Sie Ihre Befehle für viele verschiedene Systemtypen benötigen, empfehle ich, nichts anderes als elementare Dinge wie Listen von Zeichen (z. B. [abeq]
) und möglicherweise Zeichenbereiche (z [a-c]
. B. ) zu verwenden.
Diese Unterschiede bedeuten, dass die beiden Systeme nur für einfache Fälle direkt austauschbar sind. Wenn Sie einen regulären Ausdruck für Dateinamen benötigen, müssen Sie dies auf eine andere Weise tun. find -regex
ist eine Option. (Beachten Sie, dass es find -name
übrigens auch eine Glob-Syntax gibt.)
'%'
Mittel '*'
.
Beantwortung der Frage im Originaltitel:
Warum unterscheiden sich reguläre Ausdrücke von denen, die zum Filtern von Dateien verwendet werden?
Die Dateinamenerweiterung geht den regulären Ausdrücken voraus, die bereits unter den meisten Betriebssystemen (Platzhalter- / Joker-Zeichen) vorhanden waren, und ist viel einfacher und intuitiver als letztere.
Während *.txt
es für Gelegenheitsanwender leicht verständlich .*\.txt
ist, richtet sich das Analoge eher an erfahrene Benutzer / Programmierer, ganz zu schweigen von ^.*\.txt$
...
*.txt
ist nicht gleich .*\.txt
, es ist (meistens) gleich, .*\.txt$
weil es nach dem .txt
(zumindest unter der Annahme eines vernünftigen Dateinamensglobbing) nichts mehr geben kann . Vielleicht sogar ^.*\.txt$
etwas je nach Nutzung. Bewährt sich Ihr Standpunkt?