wyrażenie regularne nie działa zgodnie z oczekiwaniami w grep

0

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?

Jules Randolph
źródło
Bezpośrednim problemem, który widzę, jest użycie regexr z owiniętym regexem /(?:((\w|\.|\*)+\s+)){7}([^ .]+[0-9]+)$/igm. I kiedy używasz grep to jest po prostu (?:((\w|\.|\*)+\s+)){7}([^ .]+[0-9]+)$. Ponieważ pragniesz multiline grep to po prostu nie istnieje; grep jest ściśle jedna linia na raz.
JakeGould
Istnieje kilka różnych dialektów wyrażeń regularnych. 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.
jjlin

Odpowiedzi:

2

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.

route | grep -Po "(?:((\w|\.|\*)+\s+)){7}([^ .]+[0-9]+)$"

Uwaga: GNU grep w Solaris 11 znajduje się w /usr/gnu/bin/grep

aff
źródło