asciidoc で太字などの書式をつける場合には "*" を使って「ここが *太字* です」などのように書く。基本的には太字開始が " *" で太字終了が "* " なのだけど、太字終了部分はその後に続く文字によっては空白を入れなくても良くなる。大雑把にOKルールとNGルールを書き出すと以下。
$ cat target-file.adoc 000 NG 日本語*日本語*日本語 001 NG 日本語*日本語* 日本語 002 NG 日本語 *日本語*日本語 003 NG 日本語 *日本語* 。 004 NG 日本語 *日本語* 、 005 NG 日本語 *日本語* ) 006 NG 日本語 *日本語* ! 007 NG 日本語 *日本語* : 008 NG 日本語。 *日本語* 009 NG 日本語、 *日本語* 010 NG 日英)*English* 011 NG 日英(*English* 012 NG 日英!*English* 013 NG 日英:*English* ================================================================== 000 OK 日本語 *日本語* 日本語 001 OK 日本語 *日本語* 日本語 002 OK 日本語 *日本語* 日本語 003 OK 日本語 *日本語*。 004 OK 日本語 *日本語*、 005 OK 日本語 *日本語*) 006 OK 日本語 *日本語*! 007 OK 日本語 *日本語*: 008 OK 日本語。*日本語* 009 OK 日本語、*日本語* 010 OK 日英) *English* 011 OK 日英 (*English* 012 OK 日英! *English* 013 OK 日英: *English*
このようなNGルールにマッチして、OKルールにマッチしない grep コマンド引数を考える。
$ grep \ --color=always \ --regexp "[^ ]\*[^ -~][^\*]\+\?[^ -~]\*[^ ]" \ --regexp "[^ ]\*[^ -~][^\*]\+\?[^ -~]\*" \ --regexp "\*[^ -~][^\*]\+\?[^ -~]\*[^ 。、)]" \ --regexp "\* \(。\|、\|)\)" \ ~/tmp/target-file.adoc \ | less \ --RAW-CONTROL-CHARS ;
asciidoc の書式フォーマットは太字だけではないので、フォーマットとして使われているものを列挙して他のフォーマットでも同じOK/NGルールを適用すると以下。実際のドキュメントで偽陽性を拾ってしまう理由は、正規表現で入れ子を表現することができていないから。
$ grep \ --color=always \ --regexp "[^ 。、):\!]\(\*\|\`\|\_\)[^ -~][^\1]\+\?[^ -~]\1" \ --regexp "\(\*\|\`\|\_\)[^ -~][^\1]\+\?[^ -~]\1[^ 。、):\!]" \ --regexp "[^ -~]\(\*\|\`\|\_\) \(。\|、\|)\|:\|\!\)" \ --regexp "\(。\|、\) \(\*\|\`\|\_\)[^ -~]" \ --regexp "[^ ]\()\|(\|:\|\!\)\(\*\|\`\|\_\)[ -~]" \ ~/tmp/target-file.adoc \ | less \ --RAW-CONTROL-CHARS ;