Mam plik alphanum
z tymi dwiema liniami:
123 abc
this is a line
Nie jestem pewien, dlaczego po uruchomieniu sed 's/[a-z]*/SUB/' alphanum
otrzymuję następujące dane wyjściowe:
SUB123 abc
SUB is a line
Spodziewałem się:
123 SUB
SUB is a line
Znalazłem poprawkę (użyj sed 's/[a-z][a-z]*/SUB/'
zamiast tego), ale nie rozumiem, dlaczego to działa, a moje nie.
Możesz pomóc?
sed
regular-expression
Fakher Mokadem
źródło
źródło
ls foo*
tam używa). Ale w każdym razie, jeśli znajdziesz pytania, które są duplikatami, myślę, że powinieneś być w stanie je również oznaczyć jako takie.Odpowiedzi:
Wzór
[a-z]*
dopasowuje zero lub więcej znaków w zakresiea
doz
( rzeczywiste znaki zależą od bieżących ustawień regionalnych). Na początku łańcucha jest zero takich znaków123 abc
(tzn. Wzorzec pasuje), a także cztery z nich na początkuthis is a line
.Jeśli trzeba co najmniej jeden mecz, a następnie użyć
[a-z][a-z]*
lub[a-z]\{1,\}
, lub włączyć rozszerzonych wyrażeń regularnych zsed -E
i wykorzystanie[a-z]+
.Aby wizualizować, gdzie wzór pasuje, dodaj nawiasy wokół każdego dopasowania:
Lub, aby zobaczyć wszystkie dopasowania w liniach:
Porównaj ten ostatni wynik z
źródło
[a-z]
pasuje do zestawiania elementów, które mogą być złożone z więcej niż jednej postaci. Na przykład w niektórych lokalizacjach na Węgrzech[a-z]
mecze wdzs
Ponieważ
*
dopasowuje zero lub więcej powtórzeń poprzedniego atomu, a wszystkie silniki wyrażeń regularnych próbują znaleźć pierwsze dopasowanie. Na początku łańcucha znajduje się podłańcuch dokładnie zerowych liter, więc tam pasuje. W przypadku, gdy ciąg zaczyna się od litery,*
dopasowuje tyle, ile może, ale jest to drugorzędne znaczenie dla znalezienia dopasowania najbardziej na lewo.Dopasowania o zerowej długości mogą być nieco problematyczne, a jak zauważyłeś, rozwiązaniem jest zmodyfikowanie wzorca, tak aby wymagał co najmniej jednego znaku. Dzięki rozszerzonym wyrażeniom regularnym możesz
+
:sed -E 's/[a-z]+/SUB/'
Dla zabawy spróbuj:
źródło