- PR -

procmailの日本語で前方一致検索について

1
投稿者投稿内容
linux
ベテラン
会議室デビュー日: 2005/10/24
投稿数: 50
投稿日時: 2005-11-04 16:11
環境 OS:redhat enterprise linux 3
procmail:3.22-9
nkf:2.04-3
ディレクトリ:/home/user/.procmailrc


現在、.procmailrcでSubjectに入っている特定の日本語を検索し、
スパムの振り分けを行っていますが特定の日本語を「含む場合」しか
振り分けが行えません。

これを、特定の日本語で「始まる場合」、〜のメールボックスへという風に
前方一致検索を使いたいと考えています。
(ちなみに後方一致検索はうまくいきました。)


○Subjectのどこかに'スパム'を含む場合
 :0H
 * ^Subject: \/.*
 * ? echo "$MATCH" | /usr/bin/nkf -meZ2 | /bin/grep 'スパム'
  /home/user/spam

○Subjectの後ろが'スパム'で終わる場合($を付けました)
 :0H
 * ^Subject: \/.*
 * ? echo "$MATCH" | /usr/bin/nkf -meZ2 | /bin/grep 'スパム'$
  /home/user/spam


どなたかご存知でしたらお教え下さい。
よろしく御願い致します。




[ メッセージ編集済み 編集者: linux 編集日時 2005-11-04 16:12 ]
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2005-11-04 22:24
$MATCH
を一度、頭のなかで 表示すれば、わかるのでは
行全体ですから 件名より前の部分も/bin/grep に込めればいいのでは
linux
ベテラン
会議室デビュー日: 2005/10/24
投稿数: 50
投稿日時: 2005-11-08 11:16
MMXさん、レスありがとうございます。

Fromを含めた状態でgrepにかけるようにしたら、検索にかかりました。
○件名が「スパム」で始まる場合
 :0H
 * ? /usr/bin/nkf -meZ2 | /bin/grep ^'From: スパム'
 /home/user/spam
 

もうひとつだけ質問させて下さい。
同じ設定で本文の方も検索できるように、検索対象をBodyに設定しました。
○本文が「スパム」で始まる場合
 :0B
 * ? /usr/bin/nkf -meZ2 | /bin/grep ^'スパム'
 /home/user/spam

本文でもスパムで始まるメールを検索できるのですが、
改行後の最初の文字にも反応してしまいます。

例:1
本文
 スパム hogehogehogehoge・・・
の場合は検索できました。

しかし、
例:2
本文
 hogehogehogehogehoge・・・[改行]
 hogehogehogehogehoge・・・[改行]
 スパムhogehogehoge・・・
の場合の、改行後の最初のスパムという文字に反応してしまい
検索に引っかかってしまいます。

最初の文字や最後の文字を検索する場合、改行毎にチェックするのではなく、
本文全体として検索する方法をご存知の方がいらっしゃいましたら、ぜひお教え下さい。
よろしく御願い致します。
linux
ベテラン
会議室デビュー日: 2005/10/24
投稿数: 50
投稿日時: 2005-11-08 11:57
すいません。書き方が悪く、ニュアンスが通りにくかったです。
再度、書き込みさせていただきます。

やりたい事は、メール本文が「スパム」で始まる場合に、
/home/user/spamフォルダへ振り分けたいのです。
○procmailrcに下記を設定しました。
 :0B
 * ? /usr/bin/nkf -meZ2 | /bin/grep ^'スパム'
 /home/user/spam

この際、改行が入ると、改行後の最初の行にスパムと
書かれている場合にも検索されてしまいます。
例:1 本文
 スパム hogehogehogehoge・・・
の場合は検索できました。

しかし、
例:2 本文
 hogehogehogehogehoge・・・[改行]
 hogehogehogehogehoge・・・[改行]
 スパムhogehogehoge・・・
の場合も検索されてしまいます。

これを防ぐ為に、nkfで日本語訳した際に、
改行を含まず検索(grep)かけたいのです。
どなたかご存知の方がいらっしゃいましたら、ぜひお教え下さい。
よろしく御願い致します。
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2005-11-08 13:53
1.正規表現のオプションには、あります
それよりも
2.頭の1行を取り出すフィルターを最前置するのが「正統」では
3.単コマンドでは sed には 行範囲指定や、読込み打ち切り
があります。
わかりやすいのは、どれでしょう
=======================
人間なら 件名の頭の5−6文字で spam 判定できるというのに

[ メッセージ編集済み 編集者: MMX 編集日時 2005-11-08 14:00 ]
linux
ベテラン
会議室デビュー日: 2005/10/24
投稿数: 50
投稿日時: 2005-11-08 15:19
MMXさん、レスありがとうございます。

正規表現のオプションを調べ、[:space:]を入れて、
改行を置換して削除し、下記内容でいろいろと試してみました。
(-sを付けてシングルラインモードでも試しました)
○本文が「スパム」で始まる場合
 :0B
 * ? /usr/bin/nkf -meZ2 | sed 's/[[:space:]]//g' | /bin/grep ^'スパム'
 /home/user/spam

しかし、結果は同じで改行された文字列の先頭引っかかってしまいます。
それ以外は意図した動きをするのですが、文法的に間違っていますでしょうか?
もし間違っていたらご指摘願えませんか。
よろしく御願い致します。


また、メールの後ろに$をつけてたり、^$を付け完全一致などの
対応も合わせて行いたいので、なるべく文法を変える事無く、
改行を削除して検索を行いたかったのです。
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2005-11-09 09:50
sed 's/[[:space:]]//g'
>改行を置換して削除し
の、テスト不足です。
>文法的に間違っていますでしょうか?
ユニットテストを行い確認しましょう。

バグトラッキング・システム、プロジェクト管理システムの導入を奨めます。
_________________
1

スキルアップ/キャリアアップ(JOB@IT)