綾小路龍之介の素人思考

[GNU] grep で非 ASCII 文字を抽出

asciidoc などの書式付きテキストファイルの中でルール違反になりそうな場所をコンパイル前に予めチェックしたい。asciidoc で書かれた文書を日本語に翻訳する場合に前処理としてチェック。英語圏だと空白がつけられるので asciidoc のマークアップルールと最終成果物の関係性がわかりやすいけれど、英語圏と空白の意味が違う日本語の場合、asciidoc ように禁止ルールをコンパイル前にチェックしておいたほうがいいかもしれない。

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
;

リファレンス

  1. Chapter 10. Text Formatting
  2. AsciiDoc Syntax Quick Reference | Asciidoctor

ソーシャルブックマーク

  1. はてなブックマーク
  2. Google Bookmarks
  3. del.icio.us

ChangeLog

  1. Posted: 2007-11-14T16:10:41+09:00
  2. Modified: 2007-11-14T16:10:41+09:00
  3. Generated: 2018-11-06T23:09:27+09:00