作者: Bruce.
日時: 2006/11/16(14:19)
Bruce.です。

Bruce. writes:

> cgrepに関しては、そのEmacs起源の正規表現ルーチンをほぼ
> そのまま(ShiftJIS対応はしている)使っているものであり、
> \s \S を解釈する部分はEmacsに組み込んで使われるときでないと
> 有効にならないはず(さらに有効にしてもPerlと意味が違う)
> なので、cgrep で \s が空白を認識するというのはちょっと
> 信じられません。
> 
> ただ実際に試してみると、\s がスペースにマッチしてるっぽい
> んですよねえ。それでいて \S が空白以外にマッチしないと
> いうのもよくわかりませんが。

この件判明しました。

cgrepは正規表現ルーチンに検索パターンを渡す前に、別個にエスケープ
シーケンスの処理をしていて、そこで

\t → タブ (0x09)
\s → スペース (0x20)

への置き換えを行っています。
ですから、\s は単一のスペースにはマッチしますが、その他の空白類
(タブとか改行とか)にはマッチしません。あくまでも「エスケープシーケンス」
であって、「メタ文字」ではないということですね。

実はドキュメント(cgrep.doc)の先頭に

>	検索パターンは GNU の egrep に倣った正規表現が使えます。
>	複数の検索パターンを指定して OR、AND 検索ができます。
>	エスケープシーケンスとして \s、\t、\0ooo、\xhh が使えます。

というのがありましたとさ。

いじょ。