[時間割:Perl]『ミニマルPerl』その6
2008/10/28 01:49 posted by kunkichi
火曜日は『Perl』の時間です。行をまたがる正規表現のところから。
- 普通は . でニューライン(¥n)はとれないのだけど、シングルラインモードを使えば¥nもマッチ対象とすることができる。これを使って複数行にまたがるマッチングを行う。
$ cat lines.txt
abcde fghij
klmno pqrst
uvwxyz$ perl -00 -wnl -e '/\bfghij\b.*\bklmno\b/si and print $&;' lines.txt
fghij
klmno - ポイントは以下。
- 入力レコードセパレータを-00とか-0777とか複数行読み込めるものにする。
- マッチ修飾子にシングルラインモード(s)を有効にして、¥nがマッチするような正規表現を書く。*. とか。
- いろいろ試してみる。BINDのqueryログから、問い合わせホスト名が2文字のTLDで終わっているものを参照。
$ perl -wnl -e '/query: \S+\.[a-z][a-z] /i and print;' query.log27-Oct-2008 23:28:02.221 queries: client XXX.XXX.XXX.XXX#XXXXX 〜 query: atode.cc IN A +さらに.jpドメインのものを除外する。
27-Oct-2008 23:54:14.192 queries: client XXX.XXX.XXX.XXX#XXXXX 〜 query: www.uniqlo.jp IN A +
27-Oct-2008 23:59:02.339 queries: client XXX.XXX.XXX.XXX#XXXXX 〜 query: www.oreilly.co.jp IN A +$ perl -wnl -e '/query: \S+\.[a-z][a-z] /i and ! /query: \S+\.jp /i and print;' query.log27-Oct-2008 23:28:02.221 queries: client XXX.XXX.XXX.XXX#XXXXX 〜 query: atode.cc IN A +
- String::Approxを使ってファジーマッチングも可能。
# cat fuzzy_match
----------
#!/usr/bin/perl -s -wnl
use String::Approx 'amatch';
amatch $pattern, [ "i", "20%" ] and print;
----------echo "yafoo" | ./fuzzymatch -pattern='yahoo'
yafoo - スクレイピングの例。www.php.netの右上にあるStableのバージョンのうち、5.X系のバージョンを取得する。
$ lwp-request -o text www.php.net | perl -wnl -e '/Stable/ and /5\.\d\.\d/ and print $&;'
5.2.6
以下、grep処理のまとめ
| grepコマンド | Perlでの書き方 |
|---|---|
| grep ‘〜’ | perl -wnl -e ‘/〜/ and print;’ |
| grep -v ‘〜’ | perl -wnl -e ‘/〜/ or print;’ |
| grep -i ‘〜’ | perl -wnl -e ‘/〜/i and print;’ |
| grep -l ‘〜’ | perl -wnl -e ‘/〜/ and print $ARGV and close ARGV;’ |
| fgrep ‘〜’ | perl -wnl -e ‘/¥Q〜¥E/ and print;’ |
シチュエーションによってはgrepのほうが簡単な場合もあるけど、まあそこはケースバイケースで。ちょくちょく使って慣れていこう。。







コメント&トラックバック
トラックバックURL: