-1

シェルスクリプトについてもっと学ぼうとしていじっています。そのため、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: のドメイン部分を分離し、そのドメインが何であるかを判断することです。一部のメッセージ ID にはドメインがまったくありません。偽のドメインを持つものもあります。yahoo.co.uk のようなドメインを持っているものもあります。

すべてのメッセージには 2 つの Message-ID: エントリがあるため、ドメイン名が 2 回表示されることになります。

このスクリプトを 2 つのファイルに対して実行すると、次の結果が得られます。

# 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 にはピリオドがありません。

4

1 に答える 1

1

?記号はゼロまたは 1 を意味します。したがって、正規表現はテキスト内で少なくとも 0 個または 1 個を探して.います。.inがないためxbfoqrka、正規表現は一致を見つけます (ゼロの場合)。

正規表現は、0、1、3、100 などの任意の数に対して true を返すことに注意してください.。これは、100 ドットの文字列には少なくとも 0 または 1 つのドットがあるためです。

于 2015-08-24T03:00:44.257 に答える