Ich spielte mit erweitertem Globbing herum, aber es gibt welche Kuriosität mit dem inversen Matcher !(PATTERN)
. Betrachten Sie das folgende Beispiel
Nun sieht es so aus, als ob !()
mit der leeren Zeichenfolge übereinstimmt, aber warum stimmt *a*!(a)
nicht mit ba
überein?
Ich nahm an, dass im zweiten Beispiel ab
wie folgt angepasst ist
was wiederum eine Übereinstimmung von ba
im dritten Fall wie folgt vorschlagen würde
sieht aber so aus, als ob das nicht funktioniert.
Selbst wenn man die Gier berücksichtigt, macht das für mich keinen Sinn. Was vermisse ich?
bearbeiten:
Ich bin auf GNU bash, Version 4.1.7(2)-release (i386-apple-darwin10.4.0)
Es ist ein Fehler in Bash
Chet Ramey schrieb
[...] und das wird für die nächste Version behoben sein.
Das ist in der Tat seltsam. Ich könnte dein Verhalten reproduzieren. Die Fremdheit ist das *
hinter dem a
-Zeichen. Wenn ich deinen Code ausführe:
... es ist wie du beschrieben hast.
Aber wenn ich das zweite *
überspringe, stimmt es mit beiden Dateien überein
Das bedeutet, dass Ihre übereinstimmenden Elemente korrekt sein sollten. Die Frage ist, warum stimmt dieses zweite Sternchen nicht mit der Null-Zeichenfolge im ersten Beispiel überein. Wie die Dokumentation sagt, sollte es mit der Null-Zeichenfolge übereinstimmen, aber es scheint, als ob das nicht richtig funktioniert.
Vielleicht stimmen unsere Bash-Versionen nicht mit der Dokumentation überein?
%Vor%Das funktioniert: () hinzugefügt, um zu disambiguieren
%Vor% seltsam: *a*!(a)c
, entspricht abc
und bac
(was normales Verhalten ist)
Tags und Links bash pattern-matching