Mam ten regex:
(?<=prefix).*$
który zwraca dowolny znak następujący po „prefiksie” ciągu i działa dobrze na dowolnych silnikach wyrażeń regularnych online (np. https://regex101.com ). Problem polega na tym, że używam tego wyrażenia regularnego w bash:
grep '(?<=prefix).*$' <<< prefixSTRING
nic nie pasuje. Dlaczego to wyrażenie regularne nie działa z grep?
grep
regular-expression
mark009
źródło
źródło
.*$
dopasowuje dowolny ciąg znaków do końca linii (lub końca łańcucha), a nie tylko jeden znak.Odpowiedzi:
Wygląda na to, że zdefiniowałeś właściwe wyrażenie regularne, ale nie ustawiłeś wystarczającej liczby flag w wierszu poleceń,
grep
aby je zrozumieć. Ponieważ domyślniegrep
obsługuje BRE, a z-E
flagą robi to ERE. To, co masz (przewidywania), jest dostępne tylko w smaku regularnym PCRE, który jest obsługiwany tylko w GNUgrep
z jego-P
flagą.Zakładając, że musisz wyodrębnić tylko pasujący ciąg po
prefix
tym, jak musisz dodać dodatkową flagę,-o
aby poinformować,grep
że wypisuje tylko pasującą część jakoIstnieje również wersja,
grep
która domyślnie obsługuje biblioteki PCRE -pcregrep
w której możesz to zrobićSzczegółowe wyjaśnienie różnych smaków wyrażeń regularnych wyjaśniono w tej cudownej odpowiedzi Gilesa i narzędziach, które implementują każdy z nich
źródło
Wyrażenia regularne występują w wielu różnych smakach. To, co wyświetlasz, to wyrażenie regularne podobne do Perla (PCRE, „wyrażenie regularne zgodne z Perlem”).
grep
robi wyrażenia regularne POSIX. Są to podstawowe wyrażenia regularne (BRE) i rozszerzone wyrażenia regularne (ERE, jeśligrep
jest używane z-E
opcją). Zobacz instrukcjęre_format
lubregex
podobną instrukcję,grep
do której odnosi się ten podręcznik w twoim systemie, lub standardowe teksty POSIX, z którymi właśnie się odniosłem.Jeśli użyjesz GNU
grep
, będziesz mógł używać wyrażeń regularnych podobnych do Perla, jeśli użyjeszgrep
z opcjągrep
specyficzną dla GNU-P
.Zauważ też, że domyślnie
grep
zwraca linie , a nie podciągi z linii. Ponownie, z GNUgrep
(i niektórymi innymigrep
implementacjami), możesz użyć tej-o
opcji, aby uzyskać tylko te bity, które pasują do podanego wyrażenia z każdej linii.Należy zauważyć, że zarówno
-P
i-o
są niestandardowe rozszerzenia specyfikacji POSIX zgrep
.Jeśli nie używasz GNU
grep
, możeszsed
zamiast tego użyć bitu między ciągiemprefix
a końcem wiersza:Powoduje to jedynie wydrukowanie wierszy, którym
sed
udaje się zastosować dane podstawienie. Podstawienie zastąpi całą linię pasującą do wyrażenia (którym jest BRE) fragmentem występującym po ciąguprefix
.Zauważ, że jeśli jest kilka wystąpień
prefix
w linii,sed
odmiana zwróci ciąg po ostatniej , podczas gdygrep
odmiana GNU zwróci ciąg po pierwszej (która obejmie inne wystąpieniaprefix
).sed
Rozwiązaniem byłoby przenośny do wszystkich systemów uniksowych.źródło
Jak
grep
podają inne odpowiedzi, nie używa smaku regularnego z lookbehinds (domyślnie z GNUgrep
lub wcale z innymi wersjami).Jeśli nie możesz używać GNU
grep
lubpcregrep
możesz go użyć,perl
jeśli go posiadasz.Odpowiednikiem wiersza polecenia
perl
byłoby:Umieszczasz pożądany regex pomiędzy ukośnikami. Kiedy używasz Perla, używa to wyrażenia regularnego Perla .
źródło
print "$&\n" if ...
jeśli chcąprefix