[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

3. SEDプログラム

SEDプログラムは,一つ以上のSEDコマンド,一つ以上の-e-f--expression,そして--fileオプションや,これら のオプションが使用されていない場合は最初のオプションではない引数で渡され るものから成り立っています.このドキュメントは"その"SEDスクリプト を記述します.渡されるscriptscript-fileの全て連結したもの の意味はこれで理解できるでしょう.

それぞれのSEDコマンドは,オプションのアドレスやアドレスの幅から成り 立っていて,それには1文字のコマンド名と追加のコマンド特有のコードが続き ます.

3.1 SEDで行を選択する  Selecting lines with SED
3.2 正規表現の構文の概要  Overview of regular expression syntax
3.3 SEDバッファのデータが有る場所  Where SED buffers data
3.4 よく使用されるコマンド  Often used commands
3.5 あまり使用されないコマンド  Less frequently used commands
3.6 頑固なSEDプログラマのためのコマンド  Commands for die-hard SED programmers


3.1 SEDで行を選択する

SEDスクリプトのアドレスは,以下の形式のどれでも可能です.

`number'
行番号の指定は,入力のその行にのみマッチします.(SEDは全ての入力行 を跨って連続して行を数えることに注意してください.)

`first~step'
このGNUの拡張は,行firstで始まりstep番目の毎の行にマッ チします.特に,負ではないnが存在するとき,現在の行番号が first + (n * step)になる行が選択されます.このため,偶 数行を選択するため,1~2を使用することになるでしょう.2行目から始 まり3行毎に取り上げるため,2~3を使用することになるでしょう.10行 目から始まり5行毎に取り上げるため,10~5を使用することになるでしょ う.そして,50~050告げる曖昧な方法にすぎません.

`$'
このアドレスは,入力の最後のファイルの最後の行にマッチします.

`/regexp/'
正規表現regexpに一致する全ての行を選択します.regexp自身に /文字が含まれる場合,それぞれをバックスラッシュ(\)でエスケー プする必要が有ります.

`\%regexp%'
(%はその他全ての単一の文字で置換してもかまいません.)

これは正規表現regexpにも一致しますが,これで/以外の分離文字 を使用することが可能になります.regexp自身が大量の/を含んで いる場合,個々の/をエスケープするのも退屈なので,それを避けるため に特に役に立ちます.regexp自身が分離文字を含んでいる場合,それぞれ をバックスラッシュ(\)でエスケープする必要が有ります.

`/regexp/I'
`\%regexp%I'
正規表現にマッチさせるためのI指示語はGNUの拡張で, regexpは大文字小文字を無視してマッチします.

アドレスが与えられていない場合全ての行がマッチします.一つのアドレスが与 えられている場合,マッチする行はアドレスがマッチしたものだけになります.

アドレスの範囲はカンマ(,)で分けられている2つのアドレスで指定する ことで指定可能です.アドレスの範囲は最初のアドレスにマッチしている行から 始まり,2番目のアドレス(これは含まれます)にマッチするまで続きます.2番目 のアドレスが正規表現の場合,マッチの終りの調査は,最初のアドレスにマッチ した行の次の行から開始されます.2番目の引数がnumberで最初に マッチした行のアドレスより小さい(または同じ)場合,一行のみマッチします.

アドレス指定の終りに!文字を後置するとマッチの意味が否定されます. すなわち,!はアドレスの範囲に続いている場合,選択されたアドレスの 範囲にマッチしない行だけが選択されます.これは一つのアドレスに対 しても動作し,おそらくひねくれているだけでしょうが,何もないアドレスに対 しても動作します.


3.2 正規表現の構文の概要

[[後日,正規表現の短い概要を追加するかもしれません.今はAWKのinfoペー ジのような,他の様々な正規表現のドキュメントを参照してください.]]


3.3 SEDバッファのデータが有る場所

SEDは2つのデータバッファを管理しています.アクティブなパター ンスペースと,補助的なホールドスペースです."通常の"処理では, SEDは入力ストリームから1行読み込み,それをパターンスペースに配置し ます.このパターンスペースはテキスト操作が生じる場所です.ホールドスペー スは最初は空ですが,パターンスペースとホールドスペースの間でデータを移動 するコマンドが有ります.


3.4 よく使用されるコマンド

本当にSEDを使用するのなら,きっとこれらのコマンドを知りたいと思うで しょう.

`#'
[アドレスは利用不可能です.]

#"コマンド"はコメントを開始します.コメントは次の改行まで続きま す.

移植性を心配している場合,SED(POSIX.2に準拠していないもの)の実装に よっては,単一の一行のコメントのみサポートしていて,スクリプトの最初の文 字が#のときのみのサポートしている可能性があることを覚えておいてく ださい.

警告:SEDスクリプトの最初の2文字が#nの場合,-n(自動的 に出力しない)オプションが強制的に使用されます.スクリプトの最初の行にコ メントを書き,そしてコメントを文字`n'で開始したい場合で,このように動作 して欲しくない場合は,大文字の`N'を使用するか,`n'の前に少なくとも1つの スペースを書いてください.

`s/regexp/replacement/flags'
(/文字はsコマンドで与えられるその他の単一文字で一律に置換 してもかまいません.)

/文字(または変わりに使用されているその他の文字)は,\文字を 前置している場合のみ,regexpreplacementに書くことが可能で す.連続する2文字\nを使用して,改行をregexpに書いてもかまい ません.

sコマンドは,提供されているregexpに対しパターンスペースのマッ チを試みます.マッチが成功する場合.マッチしたパターンスペースの位置が replacementで置換されます.

replacement\n (nは1から9までの数字です)での参 照を含めることが可能で,それはn番目の\(とそのマッチと \)に含まれているマッチの位置を参照します.また,replacement に,パターンスペースのマッチ位置全体を参照する,エスケープされていない &文字を含めることも可能です.リテラルの\&,または 改行を最終的な置換物に含めるため,\を用いてreplacement内の \&,または改行に,必要となる\を確実に前置してくだ さい.

sコマンドにはゼロ以上の以下のflagsを続けることが可能です.

`g'
最初のものだけでなくすべてのregexpへのマッチを置換します.
`p'
置換が行なわれた場合,新しいパターンスペースを出力します.
`number'
regexpnumber番目のマッチのみ置換します.
`w file-name'
置換が行なわれた場合,結果を指名されたファイルに書き出します.
`I'
(これはGNUの拡張です) 大文字小文字を区別しない方法でregexpにマッチします.

`q'
[最大1つのアドレスが可能です.]

それ以上のコマンドも入力も処理せずSEDを終了します.自動的な出力が利 用不可能ではない場合,現在のパターンスペースが出力されることに注意してく ださい.

`d'
パターンスペースを削除します.すぐに次のサイクルを開始します.

`p'
パターンスペースを(標準出力に)出力します.通常このコマンドは,-n コマンドラインオプションと組み合わせて使用します.

注意:このようなSEDの実装では,自動的な出力が利用不可能ではなく, pが与えられているとき,出力行が二重になるものもあります.それ以外 の実装では,行は一回のみ出力されます.両方ともPOSIX.2標準に準拠していて, どちらかをエラーと考えることはできません.

このため,移植性の高いSEDスクリプトでは,どちらかの動作に依存するこ とはさせるべきです.-nを使用して出力したいものを明示的にするか, pコマンド(とsコマンドのpフラグ)の使用をさけてくださ い.

`n'
自動的な出力が利用不可能ではない場合,パターンスペースを出力し,何も考え ず,パターンスペースを入力の次の行で置換します.それ以上入力がない場合, SEDはそれ以上のコマンドを処理せずに終了します.

`{ commands }'
コマンドのグループは,{文字と}文字で囲んでもかまいません. コマンドのグループを単一のアドレス(またはアドレスの範囲)のマッチで開始し たいとき,これは特に役に立ちます.


3.5 あまり使用されないコマンド

前のセクションのものより使用されることはおそらく少ないでしょうが,非常に 小さく有用なSEDスクリプトには,以下のコマンドを組み込むことも可能で す.

`y/source-chars/dest-chars/'
(/文字は,yコマンドで与えられるその他の単一文字で一律に置 換してもかまいません.)

source-charsにマッチしたパターンスペースのすべての文字を,対応する dest-charsの文字に変換します.

/(またはそのかわりに使用されている文字),\や改行のインスタ ンスは,それぞれのインスタンスに\でエスケープを提供することで, source-charsdest-charsのリストに書くことが可能です. source-charsdest-charsのリストには,(エスケープを取り除く と)同じ数の文字を含める必要があります

`a\'
`text'
[最大1つのアドレスが利用可能です.]

このコマンドに続いているテキストの行(終りの\は出力から取り除かれ ます)を,現在のサイクルの終りや,次の入力行が読み込まれたときに出力され るキューに保存します.

`i\'
`text'
[最大1つのアドレスが利用可能です.]

このコマンドに続いている行(終りの\は出力から取り除かれます)をすぐ に出力します.

`c\'
`text'
マッチしたアドレスやアドレスの範囲の行を削除し,このコマンドに続いている 行(終りの\は出力から取り除かれます)を,最後の行の位置(または,ア ドレスが指定されていない場合はそれぞれの行の位置)に出力します.新しいサ イクルは,パターンスペースが削除されてから,このコマンド終了後に開始され ます.

`='
[最大1つのアドレスが利用可能です.]

現在の入力行の行数を(改行を追加して)出力します.

`l'
明確な様式でパターンスペースを出力します.出力不可能な文字(と\文 字)は,Cのスタイルでエスケープされた様式で出力されます.長い行は分割を示 す\を後置して分割されます.それぞれの行の終りには$で印が付 きます.

`r filename'
[最大1つのアドレスが利用可能です.]

filenameの内容を読み込み,現在のサイクルの終りや次の入力行が読み込 まれた時に出力ストリームに挿入するためキューに保存します.filename が読み込み不可能な場合,エラーを示すことなく空のファイルが読み込まれてい るかのように扱われることに注意してください.

`w filename'
パターンスペースをfilenameに書き出します.filenameは最初の入 力行が読み込まれる前に作成され(または切り詰められ)ます.同じ filenameで参照されるすべてのwコマンドは(sコマンド成 功時のwフラグのインスタンスを含めて),おなじFILEストリームを 通じて出力されます.

`D'
パターンスペースのテキストを最初の改行まで削除します.テキストが残ってい る場合,(入力の新しい行を読み込むことなく)結果として生じているパターンス ペースでサイクルを再び開始し,それ以外では通常通り新しいサイクルを開始し ます.

`N'
パターンスペースに改行を追加し,入力の次の行をパターンスペースに後置しま す.入力がこれ以上ない場合,SEDは終了しそれ以上のコマンドを処理しま せん.

`P'
Print out the portion of the pattern space up to the first newline.

パターンスペースの位置を最初の改行まで出力します.

`h'
ホールドスペースの内容を,パターンスペースの内容で置換します.

`H'
ホールドスペースの内容に改行を後置した後,パターンスペースの内容をホール ドスペースに後置します.

`g'
パターンスペースの内容をホールドスペースの内容で置換します.

`G'
パターンスペースの内容に改行を後置した後,ホールドスペースの内容をパター ンスペースに後置します.

`x'
ホールドスペースとパターンスペースの内容を入れ換えます.


3.6 頑固なSEDプログラマのためのコマンド

ほとんどの状況で,これらのコマンドを使用するよりは,おそらくPERLの ようなものでプログラムをした方が良いでしょう.しかし,時にはSEDに固 執することを約束する人もいて,これらのコマンドで全く複雑なスクリプトを書 くことも可能になります.

`: label'
[アドレスは利用不可能です.]

btコマンドに対するlabelの位置を指定します.それ以 外では何もしません.

`b label'
無条件でlabelに分岐します.labelは省略可能で,その場合は次の サイクルが開始されます.

`t label'
前回の入力行の読み込みやt分岐の処理以降に,sの置換で成功し たしたものがある場合のみlabelに分岐します.labelは省略可能で, その場合は次のサイクルが開始されます.


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Akihiro Sagawa on January, 21 2003 using texi2html