Wiem, że wyrażeń regularnych można używać tylko ze znakami i łańcuchami, ale czasami znajduję je w nazwach plików. Moje pytanie brzmi: czy wyrażenia regularne są używane tylko ze znakami, czy też z nazwami plików?
Wyrażenia regularne i globbing nazw plików to dwie bardzo różne rzeczy.
Wyrażenia regularne są używane w poleceniach / funkcjach do dopasowywania wzorców w tekście. Na przykład w parametrze wzorca grep
lub w językach programowania.
Globbing nazw plików jest używany przez powłoki do dopasowywania nazw plików i katalogów za pomocą symboli wieloznacznych. Możliwości globowania zależą od powłoki. Na przykład Bash obsługuje symbole wieloznaczne, takie jak:
*
dopasuj 0 lub więcej znaków?
dopasuj 1 znak[...]
dopasuj znak w określonym zestawieTe symbole wieloznaczne mogą wyglądać podobnie do wyrażeń regularnych, w rzeczywistości [...]
mają to samo znaczenie w globowaniu i wyrażeniach regularnych. Ale *
i ?
oznaczają różne rzeczy w globowaniu i wyrażeniu regularnym.
W komentarzu napisałeś:
ale w jaki sposób interpreter różnicuje *, czy jest to joker, czy wyrażenie regularne? na przykład
grep a*b a*.txt
:?
Łatwo. Raczej.
Po pierwsze, powłoka próbuje interpretować symbole wieloznaczne, dopasowując je do nazw plików. Jeśli istnieją pliki zaczynające się od „a” i kończące się na „b”, powłoka zastąpi a*b
pasującymi nazwami plików. To samo dotyczy a*.txt
. Jeśli nie ma pasujących nazw plików, powłoka przekaże argumenty grep
tak, jak były, dosłownie.
Jednak pierwszym parametrem grep
powinien być wzorzec. W 99,999% praktycznych przypadków użycia nie chcesz, aby pierwszy parametr był interpretowany przez powłokę. Najprawdopodobniej chodziło o to:
grep "a*b" a*.txt
Dzięki cytowaniu a*b
powłoka nie interpretuje go za pomocą globowania, a zamiast tego przekazuje go bezpośrednio do grep
. Z kolei grep
zinterpretuje to jako wyrażenie regularne (zgodnie z projektem).
Podsumowując, powłoka interpretuje wiersz poleceń zgodnie z własnym językiem globowania, który używa symboli wieloznacznych. Polecenia, programy interpretują swoje parametry w sposób, w jaki zostały zaprojektowane przez ich autorów.
Jeśli nazwa pliku jest ciągiem, możesz użyć wyrażenia regularnego również w nazwach plików. Na przykład: jeśli chcesz znaleźć nazwy plików pasujące do wyrażenia regularnego, możesz spróbować:
find ./ -regex '.*[abc][xyz].*'
Polecenie szuka plików o nazwach a, b lub c, po których następuje x, y lub z. To tylko przykład. Możliwości są nieograniczone.
find ./ -name 'a*'
, użyj * jako symbolu wieloznacznego. Podczas pisaniafind ./ -regex 'a*'
używasz * w wyrażeniu regularnym. Ważną różnicą jest przełącznik-name
lub-regex
.