«前の日記(2006-08-04) 最新 次の日記(2006-08-07)» 編集

いがいが日記


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

4798109126

«前の日記(2006-08-04) 最新 次の日記(2006-08-07)» 編集