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

igaiga diary

2003|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|
RSS LIRS いがいが日記検索 powered by Google
あまぞんからのお小遣いはいがいが日記の種とさせて戴きます。発芽までどうぞ気長にお待ちください。

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

[]

igaigaDiary QR