2015-06-22 2 views
1

Основываясь на результатах поиска в stackoverflow, я обнаружил разницу между grep/egrep, но я все еще не могу определить, почему это не работает. Я даже проверю его на https://regex101.com/, и он показывает, что он проверен правильно.Проблемы с regex grep/egrep

Regex:

.*ping[\/] or ping\D 

поиск против (text.txt):

path=/bin/ping6 
path=/bin/ping 

Я пытаюсь пропустить первый и только найти 2-ой.

Если бы я сделал grep ping text.txt, он нашел то, что не то, что я хочу.

grep -e ".*ping[\/]" text.txt [doesn't work] 
egrep ".*ping[\/]" text.txt [doesn't work] 
grep -P ".*ping[\/]" text.txt [doesn't work] 

я получить эту работу, но не знаю, почему:

grep -P "ping\D" text.txt [worked] 
grep -e "ping\D" text.txt [doesn't work] 

Что я не в состоянии понять, с Grep -e/задать расширенное/Grep -p/регулярное выражение?

Когда я мужчина grep -P, он сказал, что он очень экспериментальный, и не использовать его.

ответ

2

\D - это буква "D" для расширенных регулярных выражений. Для регулярных выражений perl \D является не -digit и \d является цифрой.

Для поиска «пинг», а затем, возможно цифрой, за которым следует слэш, вы хотите:

grep 'ping[[:digit:]]\?/' 
grep -E 'ping[[:digit:]]?/' 

Для поиска «пинг» не с последующей цифрой:

grep -E 'ping($|[^[:digit:]])' # ping then end-of-line or non-digit 
grep -P 'ping(?!\d)' 

GNU расширенные регулярные выражения documented here.

+0

Хорошо, что объясняет, почему это работает для grep -P, а не grep -e. Я на самом деле не хочу 6, поэтому мне нужно только слово ping, но сначала ping 6, и он соответствует. – roadzy

+0

Это не 'grep -E 'ping ($ | [^ [: digit:]])'' то ​​же самое, что 'grep -E 'ping [^ [: digit:]]''? Так как '' 'anchor - это не цифра? – ShellFish

+0

, если строка '/ bin/ping', то шаблон' 'ping [^ [: digit:]]' '** не будет соответствовать **, потому что после« ping »и« [^ [: digit:]] 'должен совпадать с одним символом. Якорь '$' соответствует пустой строке после «ping». –