Регулярное выражение egrep работает в PHP, но не работает в оболочке Unix - избегая проблем? - PullRequest
0 голосов
/ 07 октября 2011

Я думаю, что моя проблема связана с тем, чтобы избежать различий между использованием регулярного выражения в PHP и использованием его в командной строке Bash.

Вот мое регулярное выражение, работающее в PHP:

$emailregex = '^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,6})$';

Так что я пытаюсь дать следующее в командной строке, и это, похоже, ничего не соответствует. (где emails.txt - это длинный текстовый файл с тысячами (возможно, плохо сформированных) адресов электронной почты, по одному на строку).

 [root@host dir]# egrep '^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,6})$' emails.txt

Я пытался окружить регулярное выражение двойными кавычками вместо одинарных кавычек, но это не имело значения. Нужно ли добавить несколько обратных косых черт в регулярное выражение?

РЕШИТЬ! Спасибо! Мой файл был создан в Windows, и дополнительный CR в маркерах END-OF-LINE не соответствовал знаку доллара в регулярном выражении.

Ответы [ 2 ]

3 голосов
/ 07 октября 2011

Одиночные кавычки должны работать с bash ...

Это работает для меня в таком простом случае:

echo test@test.com | egrep '^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,6})$'

В вашем текстовом файле строка должна содержать только адрес электронной почты,Любые дополнительные пробелы в строке скинут.Например, это ничего не печатает:

echo " test@test.com" | egrep '^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,6})$'

Возможно, ваша проблема в том, что у вас есть файл в формате dos.В этом случае дополнительный \r сделает так, чтобы регулярное выражение не совпадало, так как он будет думать, что в конце строки есть дополнительный символ.Вы можете запустить dos2unix против него или сделать свое регулярное выражение менее строгим, удалив начальный и конечный маркеры из своего регулярного выражения:

egrep '[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,6})'
1 голос
/ 07 октября 2011

WWorks для меня:

JPP-MacBookPro-4:tmp jpp$ cat emails.txt
aa@bb.com
bb@cc.com
not an email
cc@dd.ee.ff

JPP-MacBookPro-4:tmp jpp$ egrep '^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,6})$' emails.txt
aa@bb.com
bb@cc.com
cc@dd.ee.ff
JPP-MacBookPro-4:tmp jpp$

Остерегайтесь конечных пробелов / табуляции / и возвратов - у них есть возможность кусать регулярные выражения

Здесь есть отличная ссылка на цитирование оболочки http://www.mpi -inf.mpg.de / ~ uwe / lehre / unixffb / quoting-guide.html

...