---------- SED 教室 第十回 「文字列の置換、再論」 ---------- 文字列の置換は、SED の最も基本的な命令であるとともに、最もよく使われる テクニックであり、さらに最も強力な機能です。命令の紹介は SED 教室の第五 回で、強力な機能である「タグ付き正規表現」に付いては SED 教室第七回で説 明しました。が、テクニックに関しては一通り紹介しただけなので、もう少し詳 しく説明してみたいと思います。 SED 教室の原稿は、一行に半角 72 文字詰めで書いていますが、これをもし一 行に半角 50 文字詰めに変換したいとしたら、みなさんはどうしますか? フリー ウェア、市販ソフトを含めて相当数のテキスト整形ツールが出回っていますから、 これらのツールを使えば簡単です。大抵の整形ツールはオプションで一行あたり の文字数を指定すれば、入力テキストを指定した文字数でそろえて出力してくれ ます。 でもちょっと待ってください。テキスト整形ツールの基本的な機能は、読み込 んだテキストを加工して出力するだけです。つまりフィルタです。という事は SED でも同じ事が出来そうですね。というわけでスクリプトです。 <<< FORM.SED >>> --------------------------------------- 1 :loop 2 $!{ 3 N 4 /\n[  ]*$/!b loop 5 } 6 s/[  ]*\n[  ]*//g 7 s/[ -龠]/&!/g 8 s/................................................../&\ 9 /g 10 s/\([ -龠]\)\(\n\)!/\1!\2/g 11 s/\(\n\)\([、。ー]!\)/\2\1/g 12 s/\([ -龠]\)!/\1/g --------------------------------------- このスクリプトは、空行 (空白以外の文字が無い行) を段落の切れ目と判断し、 テキストを一行に半角 50 文字詰めに整形します。 四行目は、パターンスペースの最後のセグメントが空行でないならば「:loop」 にジャンプします。つまり空行が現れるまで三行目の「N」が実行されるので、 パターンスペースには一段落が記憶されます。そして六行目以降の命令が実行さ れます。 さて、七行目は何をしているのでしょう。正規表現「[ -龠]」は何を表すで しょうか。「 」(全角空白, シフト JIS コードで 8140) は全角文字の最初の 文字です。そして「龠」は全角文字の最後の文字です (旧JIS では最後の文字で すが、新JIS では「堯槇遙瑤」の四文字が追加されていますので、最後の文字は 「瑤」になります)。ということは「[ -龠]」は任意の全角文字とマッチします ね。置換文字列は「&!」ですから、任意の全角文字を「&!」に置換する...? 実は置換文字列中の「&」は、特別な意味を持っていまして、正規表現がマッ チした文字列を表すのです。つまり次の置換命令と同じ意味です。 s/\([ -龠]\)/\1!/g 「&」はマッチした文字列に、なにか文字列を加えたいとき便利です。この場 合でしたら任意の全角文字の後ろに「!」をつけるわけです。たとえばパターン スペースが「SED 教室 第十回 」だったとしますと、この置換命令を実行した後 は、「SED 教!室! 第!十!回! 」になります。なるほど、でも一体何の為にこん な置換をするのでしょう? みなさんもよくご存知の通り、ほとんどのパソコン/ワープロの画面上では、 全角文字は半角文字 2 文字分のスペースを占めます。従って、一行に半角 50 文字詰めにするときは、全角文字を 2 文字分として数える必要があります。2 文字分にするためには...もうおわかりですね。全角文字の後ろに「!」をつける 事により、全角文字を 2 文字分として扱おうという目論見です。 さて次の置換命令は八~九行目にわたっています。正規表現の部分には 50 個 の「.」が並んでいますから、任意の 50 文字にマッチします。マッチする文字 列が沢山ある場合は既に説明したように、一番左にある文字列を置換するのでし た。つまり先頭から数えて 50 文字目までの文字列が「&<改行>」に置換される のです。おっと、また「&」が使われていますから、改行コードが 50 文字目の 次に追加されます。 置換命令の最後に「g」がついている事に注意してください。「g」がつくとマッ チする文字列が全て置換されるのでした。ただし一度置換された部分は置換しま せんから、次の置換対象は 51 文字目以降の文字列です。従って 51 ~ 100 文 字目が置換されます。つまり 100 文字目の次に改行コードが追加されるわけで す。以下同様にしまして、50 文字毎に改行コードが挿入されます。 十行目は、2 文字分の全角文字の間に改行コードが入ってしまったときの対策 です。十一行目は行頭禁則処理です。基本的な禁則しかしていませんが、応用は 容易だと思います。十二行目で、全角文字の後ろにつけた「!」を取り除きます。 今回の SED 教室は大変短いですが、何分まだ論文が書けていないので (あと 20 ページほど英文で書かなければならない。;_;) この辺で... --- GCD03723 (Greatest Common Divisor:最大公約数)