Mam 3 katalogi na bieżącej ścieżce.
$ls
a_0db_data a_clean_0db_data a_clean_data
$ls a_*_data
a_0db_data:
a_clean_0db_data:
a_clean_data:
$ls a_[a-z]*_data
a_clean_0db_data:
a_clean_data:
Spodziewałem się, że ostatnie polecenie ls będzie pasować tylko a_clean_data
. Dlaczego pasuje również do tego, który zawiera 0
?
bash --version
GNU bash, version 4.2.24(1)-release (i686-pc-linux-gnu)
bash
regular-expression
wildcards
użytkownik13107
źródło
źródło
a_*_data
pasował do któregoś z tych plików, nie zaskoczył cię?Odpowiedzi:
Ta
[a-z]
część nie pasuje do liczby; to jest*
. Być może mylisz globbing powłoki i wyrażenia regularne .Narzędzia lubią
grep
przyjmować różne smaki regexes ( podstawowe domyślnie-E
dla przedłużony-P
do Perl regex )Np. (
-v
Odwraca dopasowanie)Jeśli chcesz użyć wyrażenia regularnego, oto przykład, jak sprawdzić, czy zmienna
$ref
jest liczbą całkowitą:źródło
Problem w tym: dlaczego
a_[a-z]*_data
pasujea_clean_0db_data
?Można to podzielić na cztery części:
a_
dopasowuje począteka_clean_0db_data
, pozostawiającclean_0db_data
do dopasowania[a-z]
dopasowuje dowolny znak z zakresua-z
(np.c
), pozostawiająclean_0db_data
do dopasowania*
dopasowuje dowolną liczbę znaków, nplean_0db
_data
pasuje do końcowego_data
W wyrażeniach regularnych
[a-z]*
oznaczałoby to dowolną liczbę znaków (w tym zero) z zakresu a..z , ale masz do czynienia z globowaniem powłoki, a nie z wyrażeniami regularnymi.Jeśli potrzebujesz wyrażeń regularnych, kilka
find
implementacji ma-regex
predykat:-maxdepth
Jest tylko tutaj, aby ograniczyć wyniki wyszukiwania dla różnych wyszukiwarek do folderu w którym jesteś. Na wyrażenie regularne pasuje do całego pliku, więc dodałem^.*/
dopasować path-częściźródło
*
we wzorach powłok dopasowuje 0 lub więcej znaków. Nie należy go mylić z*
operatorem wyrażenia regularnego, który oznacza 0 lub więcej poprzedniego atomu .W
*
podstawowych wzorcach powłok nie ma odpowiednika wyrażenia regularnego . Jednak różne powłoki mają do tego rozszerzenia.ksh
ma*(something)
:możesz mieć to samo
bash
zshopt -s extglob
lubzsh
zsetopt kshglob
:In
zsh
zextendedglob
włączonym#
jest równoważne wyrażeniu regularnemu*
:W najnowszych wersjach
ksh93
możesz także używać wyrażeń regularnych w globach. Tutaj z rozszerzonymi wyrażeniami regularnymi:Pamiętaj, że
[a-z]
pasuje do różnych rzeczy w zależności od bieżących ustawień regionalnych. Zazwyczaj dopasowuje tylko 26a
doz
łacińskich nieakcentowanych liter wC
ustawieniach regionalnych. W innych lokalizacjach zazwyczaj pasuje więcej i nie zawsze ma to sens. Aby dopasować literę w swoim regionie, możesz preferować[[:alpha:]]
.źródło
[a-z]
dopasowania więcej niż 26 liter pasujących do ustawień regionalnych C? Pamiętam, kiedy po raz ostatni na to patrzyłem, wszystkie kodowania praktycznie stosowane w wariantach Uniksa miały ISO-646 jako podstawę (wtedy górne 128 kodów było używane inaczej, bezpośrednio dla znaków w kodowaniach takich jak ISO-8859-X, połączone w kodowania takie jak UTF-8 lub rodzina EUC). Nawet AIX nie miał ustawień narodowych EBCDIC (przynajmniej dla mnie dostępnych). Pamiętam, jak próbowałem sprawdzić, czy standardy POSIX / UNIX tego wymagały, ale nie pamiętam wyniku.[a-z]
ogólnie zawieraé
lubí
(ale niekoniecznieź
) w lokalizacjach, w których zestaw znaków ma je, niezależnie od tego, czy kod w tym kodowaniu jest między kodem ai z, czy nie. Tylko ustawienia regionalne C gwarantują porządek sortowania na podstawie wartości punktu kodowego. Zobacz tę inną odpowiedź, aby uzyskać więcej informacji.