Почему это регулярное выражение не улавливает периоды правильно?

Я пытаюсь узнать больше о сценариях оболочки. Итак, у меня есть несколько файлов с электронной почтой, которые spamassassin записывает в каталог, и я подумал, что я попытаюсь сделать для них какое-нибудь сопоставление регулярному выражению. Итак, я выбираю файлы, которые требуют разных совпадений, а затем пытаюсь их отсортировать.

Я написал этот сценарий:

#!/usr/local/bin/bash
#
regex='(\.)?'
files="/var/spool/spam/testing/out.*"
for i in $files; do
domain=`cat $i | grep -i "Message-ID: <" | cut -d'@' -f2 | cut -d'>' -f1 | cut -d' ' -f1`
echo "Domain is $domain"
echo "We're starting the if loop"
if [ -z "$domain" ];
then
echo "Domain is empty"
echo $i
#rm $i
elif ! [[ "$domain" =~ $regex ]];
then
echo "There are no periods in the domainname $domain"
elif [[ $domain =~ $regex ]];
then
echo "There are periods in the domainname $domain"
fi
done

Я пытаюсь выполнить отдельную доменную часть Message-ID: и затем определить, что это за домен. Некоторые идентификаторы сообщений вообще не имеют домена. У некоторых есть поддельные домены. У некоторых есть такие домены: yahoo.co.uk.

Каждое сообщение имеет две записи Message-ID: записи, поэтому доменные имена появляются дважды.

Когда я запускаю этот скрипт для двух файлов, я получаю следующий результат:

# bash /usr/local/bin/rm-bounces.sh 
Domain is xbfoqrka
xbfoqrka
We're starting the if loop
There are periods in the domainname xbfoqrka
xbfoqrka
Domain is SKY-20150201SFT.com
SKY-20150201SFT.com
We're starting the if loop
There are periods in the domainname SKY-20150201SFT.com
SKY-20150201SFT.com

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

1 ответ

? Символ означает ноль или единицу. Так что регулярное выражение ищет по крайней мере ноль или один . в тексте. Так как нет . в xbfoqrka затем регулярное выражение находит совпадение (для нуля).

Обратите внимание, что регулярное выражение вернет true для любого числа . - ноль, один, три, 100 и т. д. Это потому, что строка со 100 точками имеет как минимум ноль или одну точку.

Другие вопросы по тегам