- 2006-10-11 (Wed) 20:12
- プログラミング ( sed/wake/awk )
sed は s コマンドしか使えないというのも悲しいので他のコマンドも含めてちゃんと学習しなおす.
とりあえず,sed にはパターンスペースとホールドスペースという二つのバッファがあって,それぞれ改行文字でセグメントという単位に区切られる.s コマンド以外は,これら二つのバッファに対して queue の操作みたいなことを行うか,ラベルへのジャンプをするのが基本.sed の基本的な文法は
「条件」「コマンド」 「条件」「コマンド」 …
で,上から順にパターンスペースが条件にマッチしたらコマンドが実行される.
条件抜粋:
- 数字
- 指定行番号
- $
- 最終行である
- 条件1,条件2
- 条件1が成立した行から条件2が成立した行まで. ある種のフラグとして利用可能
- 条件!
- 条件が成立しない
- /正規表現/
- 正規表現にマッチ
使うコマンドの抜粋:
- p
- パターンスペースを改行つきで出力
- P
- パターンスペースの最初のセグメント(改行で区切られたもの)を出力
- q
- パターンスペースを改行つきで出力して終了
- {
- 次の } までを命令として実行
- s/正規表現/文字列/
- 正規表現にマッチする部分を文字列に置き換える(最初のみ)
- s/正規表現/文字列/g
- 正規表現にマッチする部分を文字列に置き換える(全部)
- y/文字列1/文字列2/
- 文字列1 の各文字を文字列2の対応する文字に置換
- d
- パターンスペースを削除後に新しい行をパターンスペースに読み先頭へジャンプ
- D
- パターンスペースの最初のセグメントを削除し先頭に戻る.パターンスペースが空なら次の行を読みこむ
- N
- 一行読みパターンスペースに追加(改行も生きてる)
- h
- パターンスペースの内容をホールドスペースに読み込む
- H
- パターンスペースの内容をホールドスペースへ追加
- g
- ホールドスペースの内容をパターンスペースに読み込む
- G
- ホールドスペースの内容をパターンスペースに追加
- x
- パターンスペースとホールドスペースの内容の入れ替え
- b ラベル
- ラベルへジャンプ.ラベルなしで先頭へジャンプ
- t ラベル
- 直前の s で置換されたらジャンプ(正規表現条件と s と b で置換可能)
- :ラベル
- ジャンプ先のラベル
- i\ 文字列
- 文字列を出力.行頭の空白や改行には \ をつける
TIPS:
- /正規表現/{ 命令列 } という書き方を見ると awk を思い出せる
- スクリプトの最後にジャンプが無いときは p と d が挿入される
- s コマンドとかで正規表現が省略されると直前の正規表現が使われる
- コマンドはセミコロンで区切ると一行で書ける
とりあえず,セグメントに区切って複数のデータを持ち運びつつ,s を使って必要な部分を抜き出して加工すると.何かのアルゴリズムを sed で実装するための導出規則がほしいところだ.
- Newer: AWK - はじめ