2006-08-05 青空に投げられたブーケ [長年日記]
_ 正規表現
最近、(遅ればせながら)正規表現を勉強しています。
# 本は「正規表現辞典」を使ってます。
# 例文も多いし、処理系実装依存の部分が丁寧に書いてあっていいです。
検索のときにコードで書いたら何行もかかる処理が数文字でかけて便利です。
この辺はSQLの便利さと似ていると思う。
さて、先日、仕事でログを解析していて困りました。
「hogeで始まって、fooで終わらない行」というのを表すとどうなるでしょう?
^hoge.*(?!foo$)
だと思ったのですがうまくいかない。
^hoge.*(?=bar$)
だと「hogeで始まって、barで終わる行」になるので、
これの後半を否定にすればいいのですが分からず。
識者の方々に聞いたところ、
^hoge.*(?<!foo)$
でいけると教えてもらいました。なるほど。
しかし、pythonだとこれでいいのですが、
秀丸の正規表現だと制限事項で (?<!を行頭以外で使えない。
そこで grep "^hoge" target.txt | grep -v "foo$" という合わせ技を伝授される。
# -v は結果反転。含まない行を表示。
なるほど、組み合わせればいいんだ。
Mac(darwin)だとこれでうまくいきました。
しかしcygwinだと$が行末にマッチせずに全体の末尾だけにマッチ。
原因は改行コードで、
cygwinのgrepでは$がLFにはマッチするけどCRにマッチしない模様。
winのデフォルトはCR,LFなので、「.$」にすればマッチ。
もしくは改行コードをLFにしてあげればいい。
dos2unix.exeを使えば改行コードを変更できます。
dos2unix.exe < target.txt | grep "^hoge" | grep -v "foo$"
いろいろ教えてくださった皆様、ありがとうございました。m(_ _)m