ごぶさたしておりました。sed拾遺物語こと補遺です。
補遺1:お取り置きしましょうか?~パターンスペースとホールドスペース
sedは行単位でコマンドを実行するものです。それはどおゆうことかといいますと。56億7千万行のテキストファイルがあったとしても。その全部をどか~んと一気に扱うわけではないということです。森の小人さんのように地道に1行1行、取り込んではコマンドを実行しているわけなんですね。その取り込み先こと、小人さんの作業場のことをパターンスペースといいます。パターンスペースはテンポラリバッファらしいですがアモールバッファ(c)平沢進とどう違うんでしょおか。うむむ。
冗談はさておき。sedのもうひとつのバッファにホールドスペースというものがあります。これは小人さんの倉庫です。パターンスペースとホールドスペース間でデータを移動できるのがsedの特徴なのでした。
つまり。先にパターンスペースで下味をつけておいた材料をホールドスペースにいったん保管しておいて。別の材料の準備がととのい次第、もう一度パターンスペースに戻して、別の材料とまぜまぜするなどということができるのですね。ホールドスペースは倉庫というより待避所といった方がいいかもしれない。
こおゆうホールドスペースに関係するコマンドには、以下のものがあります。
h , H
待避コマンド。パターンスペースの内容をホールドスペースにもっ てゆく。 hはそれまでのホールドスペースの内容に上書き、Hはその下に追加する 。
g , G
復帰コマンド。ホールドスペースの内容をパターンスペースに戻す 。gは上書き、Gは追加。
x
交換コマンド。パターンスペースとホールドスペースの中身をチェ ンジする。
ある条件をもつ行の順番を入れ替えたり、段落ごとに操作をしたりする場合に使えるコマンドであります。例ですか。はい。
あ。例の前に。複数のコマンドを使うときは、スクリプトファイルの中を
あどれす{
こまんどお
別のこまんどお
もういっちょこまんどお
}
という形にしますので念のため。
例文として。次の2行からなるファイルがあるとします。
いざスープの水面に帆を立てて
道のひびから花が咲く
この2行をひっくり返すスクリプトは。1行目をホールドスペースに待避して、2行目(=最終行)の後ろでパターンスペースに戻せという内容になります。
1{
h
d
}
${
G
}
という具合(注:$は正規表現ではなく、最終行を表す)。結果は。
道のひびから花が咲く
いざスープの水面に帆を立てて
注意しなくてはならないのはhとdコマンド。もしhでなくHにした場合、それまでのホールドスペースの下に追加されるので。ホールドスペースが空であったら、その空行の下に追加されてしまうのです。つまりよけいな空行が「いざ~」の上についちゃうわけ。
また、hでホールドスペースに1行目を待避しても、パターンスペースには残っているので (カットするのではなくコピーしているので) dコマンドでいったんパターンスペースから1行目を削除しています。
補遺2:祈るようにsedを探して駆けてたこと~参考文献
「sedは日暮れて」を書く上で参考にしたのは、
Dale Dougherty著、福崎俊博訳『sed & awk プログラミング』(アスキー出版局)
です。筆者の愛が伝わってくるよいご本であります(^0^)。その他にMS-DOSの古い256倍本も一部参考にしました。
インターネット上では、NiftyServe FMCN フォーラムで行われていたSED教室の内容がWebあるいはftpでgetできます。
SEDLEC Release 1.11←95年改訂の最新版(Web)
SEDLEC Release 1.00←92年のオリジナル版(ftp。docファイル)
「sedは日暮れて」はsコマンド中心の内容でしたが、こちらは別コマンドを含んだやや難しめの内容だと思います。
NIFTY Serveでは、他にFWORK(在宅ワークフォーラム)でも在宅翻訳がらみで、sedの参考文献の話が出ていたようです。