2011年11月18日

行連結sedスクリプトを訂正しました

昨年6月に書いた「行連結sedスクリプト」を訂正しました。「ちぇ、動かへんやん」とがっかりされた皆さん、すみません。

スクリプトA: 段落冒頭の字下げを全角空白でしてある原稿用
:loop
$!N
s/\(.\+\)\n\([^ ]\+\)/\1\2/
t loop
P
D

5−6行目が必要でした。スクリプトBも同様です。(実は、ずーっと以前にこのスクリプトを書いた時には、この形だったのですが、しばらくsedを使わないうちに、すっかり頭がなまっていて、昨年6月にはPとDがどう動くかを忘れていたのです。

 は全角空白です。

次の段落の1行目を読み込んだ時、3行目の置換は失敗し、loopを抜けます。
この時、パターンスペースの中身は、
 現在の段落\n 次の段落の1行目
という形になってます。

5行目のコマンドPはパターンスペースの「\n」までの部分を出力します。
つまり、2−3行目でつなげられた部分のうち、
 現在の段落\n
が出力される訳です。

次いで6行目のコマンドDでパターンスペースの「\n」までの部分を削除します。
この時、パターンスペースには、
  次の段落の1行目
が残ります。

コマンドDは処理をスクリプトの先頭に戻します。


sedスクリプトを書く時は、パターンスペースに何が入っているか、よっく考えなければなりませんね。あ〜、難しかった (*_*;

0 件のコメント: