grepの挙動について

| コメント(0) | トラックバック(0)

grepいいよね。
使いこなせるようになるとなんでもgrepの正規表現で済まそうとして、
実は便利なオプションがあることに気がつかなかったりするとかね。

さてさて、最近ちょっと気になってたんだけど、
Linuxのgrepコマンドで行末がなぜかヒットしないという件。

例えば、

1:
2:foo
3:

というファイルを用意する。

そして[hanai@hostname] /bin/grep "^foo$" /tmp/fileのようなコマンドを書くと、
行頭から「foo」で「foo」の後にすぐ改行が来る行に一致するはずなんだけど、
これが一致しないのだ。
CentOS5.8のgrepなんだけど。

このファイルだけなら[hanai@hostname] /bin/grep "^foo" /tmp/fileに書き直せばいいんだけど、
foooooooo
とか
foobar
とか
foo bar buzz
みたいな行があるときに具合が悪い。
このような時はPerl互換正規表現オプションをつけて、行末を引っ掛ければとりあえず大丈夫な感じになった。
[hanai@hostname] /bin/grep "^foo$" /tmp/file

[hanai@hostname] /bin/grep -P "^foo\\r" /tmp/file
しかし相変わらず行末はヒットしない。
ネットで検索すると、grepで行末を表す「$」の表現は利用できるって書いてあるんだけど、実際どっちなんだろう??

ちなみに同梱されているPerlのprint grep("/^foo$/", $str);のような正規表現では大丈夫だった。
ついでに正規表現についてはこのページがとても役に立った紹介しておこう。
ときどきの雑記帖:正規表現メモ

トラックバック(0)

トラックバックURL: http://cartier.sakura.ne.jp/mt/mt-tb.cgi/1007

コメントする

skype:
ログイン状態

月別 アーカイブ