24 February 2013

小説テキスト記述フォーマットを青空文庫形式に変換するsedルール

ルビ(読み仮名)や傍点の記述フォーマットを青空文庫形式に変換するsedルール

■ 変換対象の記述フォーマット

変換前

ルビの記述 → 我輩{わがはい}は猫である
傍点の記述 → 我輩は<傍点>猫</傍点>である

変換後 (青空文庫形式)

ルビの記述 → 我輩《わがはい》は猫である
傍点の記述 → 我輩は猫[#「猫」に傍点]である

■ 変換のコツ

{ ○○○○○ } のように、一組の開始タグと終了タグの間に、同種類のタグが入ることは無い。 たとえば、{ ○○{○○○ } というようなことは起こらないとする。

sedの文字列置換ルール


s/{\(.*\)}/《\1》/g

というルールを適用すると、例えば { ○○○ } △△△ { □□□ } というような入力文字列を処理すると、《 ○○○ } △△△ { □□□ 》 のような予想外の結果となる。 (ルールは入力文字列の外側より適用されていくため)

ということで、次のようなルールを定義するとうまくいく。(このルールでは、”{ ○○○ }” に囲まれた領域は ” { ” を除く1文字以上20文字以下の文字列にマッチする)


s/{\([^{]\{1,20\}\)}/《\1》/g

■ sed変換ルール

replace.sed

# 傍点の置換
s/<傍点>\([^<]*\)<\/傍点>/\1[#「\1」に傍点]/g
# ルビの置換
s/{\([^{]\{1,20\}\)}/《\1》/g
# 半角の & を全角に変換 (pLatexでの処理を正しく行うため)
s/\&/&/g
# 半角の ? を全角に変換 (縦書フォントで正しく表示させるため)
s/?/?/g

このルールファイルを作成した後


$ sed -f replace.sed test.txt

■ 参考資料

正規表現メモ(sed, perlなど、それぞれの環境での正規表現のサポート状況