Mój problem dotyczy wyrażenia regularnego. Dzięki regexr
, Udało mi się napisz wyrażenie który odpowiada nazwie interfejsu route
Polecenie linux dało mi.
Ale nie mogę tego złapać:
route | grep -Eo "(?:((\w|\.|\*)+\s+)){7}([^ .]+[0-9]+)$"
Dlaczego?
regexr
z owiniętym regexem/(?:((\w|\.|\*)+\s+)){7}([^ .]+[0-9]+)$/igm
. I kiedy używaszgrep
to jest po prostu(?:((\w|\.|\*)+\s+)){7}([^ .]+[0-9]+)$
. Ponieważ pragniesz multilinegrep
to po prostu nie istnieje;grep
jest ściśle jedna linia na raz.grep -E
i JavaScript (regexr
dialektu, z szybkiego wyglądu), nie używaj dokładnie tego samego, więc możesz użyć wyjścia regexr jako punktu wyjścia.Odpowiedzi:
Różne programy (i różne wersje tego programu) mogą korzystać z różnych implementacji wyrażeń regularnych. Spróbuj zmniejszyć lub rozbić część wyrażenia regularnego po części, aby wiedzieć, która funkcja jest obsługiwana / nie jest obsługiwana.
Na przykład muszę usunąć grupa nie przechwytująca specyficzny
?:
z twojego przykładu, żeby mój GNU grep może działać zgodnie z oczekiwaniami w systemie Solaris 11.Lub możesz spróbować zastąpić
-E
z-P
używać Silnik wyrażeń regularnych Perla które w moim przypadku robią moje GNU grep potrafi uruchomić regex bez dalszych modyfikacji.Uwaga: GNU grep w Solaris 11 znajduje się w
/usr/gnu/bin/grep
źródło