Wyrażenia regularne VS Globbing nazw plików

15

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?

Hamza
źródło

Odpowiedzi:

19

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 greplub 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 zestawie

Te 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*bpasującymi nazwami plików. To samo dotyczy a*.txt. Jeśli nie ma pasujących nazw plików, powłoka przekaże argumenty greptak, jak były, dosłownie.

Jednak pierwszym parametrem greppowinien 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*bpowłoka nie interpretuje go za pomocą globowania, a zamiast tego przekazuje go bezpośrednio do grep. Z kolei grepzinterpretuje 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.

janos
źródło
4

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.

nikt
źródło
ale w jaki sposób interpreter różnicuje *, czy jest to joker, czy wyrażenie regularne? na przykład: $ grep a „asterix” b a „asterix” .txt
Hamza
2
Jeśli używasz find ./ -name 'a*', użyj * jako symbolu wieloznacznego. Podczas pisania find ./ -regex 'a*'używasz * w wyrażeniu regularnym. Ważną różnicą jest przełącznik -namelub -regex.
nikt