Czym różnią się wyrażenia regularne od symboli wieloznacznych używanych do filtrowania plików
15
Chociaż używamy *do oznaczenia zero lub więcej poprzednich znaków grep, używamy *.cdo znajdowania wszystkich plików C, gdy używamy go z lspoleceniem podobnym ls *.c. Czy ktoś mógłby powiedzieć, w jaki sposób użycie *różni się w tych dwóch przypadkach?
Globbing nazw plików powłoki i wyrażenia regularne używają tych samych znaków i mają one podobne cele, ale masz rację, nie są kompatybilne. Globowanie nazw plików jest znacznie mniej wydajnym systemem.
Globbing nazw plików:
* oznacza „zero lub więcej znaków”
? oznacza „dowolny pojedynczy znak”
Ale w wyrażeniach regularnych musisz używać .*„zero lub więcej znaków” i .„dowolny pojedynczy znak”. A ?oznacza coś zupełnie odmiennego w wyrażeniach regularnych: zero lub jedno wystąpienie poprzedniego elementu RE.
Nawiasy kwadratowe ( []) wydają się działać tak samo w obu systemach w systemie, na którym piszę, przynajmniej dla prostych przypadków. Dotyczy to między innymi klas znaków POSIX (np [:alpha:].). To powiedziawszy, jeśli potrzebujesz, aby twoje polecenia działały na wielu różnych typach systemów, odradzam używanie czegokolwiek poza podstawowymi rzeczami, takimi jak listy znaków (np. [abeq]) I może zakresy znaków (np [a-c].).
Różnice te oznaczają, że oba systemy można bezpośrednio zamieniać tylko w prostych przypadkach. Jeśli potrzebujesz wyrażenia regularnego nazw plików, musisz to zrobić w inny sposób. find -regexjest jedną z opcji. (Zwróćmy uwagę, że istnieje także find -namesposób, w jaki używa się składni glob.)
Ponadto istnieją różne smaki wyrażeń regularnych. Nie wszystkie wyrażenia regularne są tworzone tak samo! I masz wiele innych sposobów dopasowywania wzorca, takich jak SQL , takich jak , gdzie '%'środki '*'.
Pan Lister,
4
Dwa główne smaki wyrażeń regularnych to POSIX i PCRE (RE zgodny z Perl). Później jest mniej skomplikowany i ma więcej funkcji. Narzędzia i powłoki uniksowe zazwyczaj używają POSIX, większość języków programowania z wbudowanymi wyrażeniami regularnymi (oprócz powłoki) używa PCRE. Uważaj tylko na różnicę podczas czytania materiałów online.
goldilocks,
11
Odpowiedź na pytanie wyrażone w oryginalnym tytule:
Dlaczego wyrażenia regularne różnią się od tych używanych do filtrowania plików?
Rozszerzenie nazwy pliku poprzedza wyrażenia regularne, które istniały już w większości systemów operacyjnych (znaki wieloznaczne / joker) i jest znacznie prostsze i intuicyjne niż ten drugi.
Choć *.txtjest łatwy do zrozumienia dla zwykłych użytkowników, analogia .*\.txtjest czymś bardziej ukierunkowanym na doświadczonych użytkowników / programistów, nie wspominając o ^.*\.txt$...
Kolejny powód części „dlaczego”: prędkość. Wyrażenia regularne są wolniejsze: pastebin.com/3iNCgkE3
manatwork
3
*.txtnie jest równy .*\.txt, to (głównie) jest równy, .*\.txt$ponieważ po .txt(przynajmniej przy rozsądnym globowaniu nazw plików) nie może być niczego . Być może nawet ^.*\.txt$nieco w zależności od użycia. Udowadnia swój punkt widzenia?
'%'
środki'*'
.Odpowiedź na pytanie wyrażone w oryginalnym tytule:
Rozszerzenie nazwy pliku poprzedza wyrażenia regularne, które istniały już w większości systemów operacyjnych (znaki wieloznaczne / joker) i jest znacznie prostsze i intuicyjne niż ten drugi.
Choć
*.txt
jest łatwy do zrozumienia dla zwykłych użytkowników, analogia.*\.txt
jest czymś bardziej ukierunkowanym na doświadczonych użytkowników / programistów, nie wspominając o^.*\.txt$
...źródło
*.txt
nie jest równy.*\.txt
, to (głównie) jest równy,.*\.txt$
ponieważ po.txt
(przynajmniej przy rozsądnym globowaniu nazw plików) nie może być niczego . Być może nawet^.*\.txt$
nieco w zależności od użycia. Udowadnia swój punkt widzenia?