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

3. SEDプログラム

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

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

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 sコマンド  sed's Swiss Army Knife
3.6 あまり使用されないコマンド  Less frequently used commands
3.7 sedのベテランプログラマのためのコマンド  Commands for sed gurus
3.8 GNU sed特有のコマンド  Commands specific of GNU sed
3.9 正規表現でのエスケープに関するGNUの拡張  Specifying special characters


3.1 sedで行を選択する

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

`number'
行番号の指定は,入力のその行だけにマッチします.(sedは,-i-sオプションが指定されていない限り,全ての入力行に渡り,連続し て行を数えることに注意してください.)

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

`$'
このアドレスは,入力の最後のファイルの最後の行や,-i-s オプションが与えられているときは,それぞれのファイルの最後の行にマッチし ます.

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

POSIXLY_CORRECTが設定されていない場合,空の正規表現//は, 前回の正規表現に繰り返しマッチします(それは,空の正規表現がsコマ ンドに渡されても同じです).正規表現を編集すると,正規表現がコンパイルさ れるときに評価されるので,空の正規表現とともにそれらを指定することは不正 な処理になることに注意してください.代わりにPOSIXLY_CORRECTが設定 されている場合,//は何にもマッチしません.この動作はPOSIXか ら依頼されていますが,GNU sedのデフォルトの動作を軽率に変更すると, かなり多くの古いsedスクリプトが駄目になるでしょう.

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

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

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

`/regexp/M'
`\%regexp%M'
正規表現のマッチに対するM指示語は,GNU sedの拡張で,^$を(通常の動作に加え)それぞれ改行後の空の文字列と改行前の空の文 字列にマッチさせます.バッファの最初とバッファの最後に常にマッチする特別 な文字の並び(Perlモードの\A\Z,基本または拡張正規表現モー ドの\`\')があります.Mmulti-lineを意味し ます.

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

アドレスの範囲はカンマ(,)で分けられている二つのアドレスで指定する ことで指定することが可能です.アドレスの範囲は最初のアドレスにマッチして いる行から始まり,二番目のアドレス(これは含まれます)にマッチするまで続き ます.二番目のアドレスが正規表現の場合,マッチの終りの調査は,最初のアド レスにマッチした行の次の行から開始されます.GNUの拡張として, regexpが最初の入力行にもマッチするように,0の行番号を 0,/regexp/のようなアドレス指定で使用することが可能です.

二番目のアドレスがnumberで最初にマッチした行のアドレスより小さい (または同じ)場合,一行のみマッチします.

GNU sedも特殊な二つのアドレス形式をサポートしています.

`0,addr2'
addr2が見つかるまで,"最初のアドレスにマッチしている"状態で開始し ます.これは1,addr2に似ていますが,addr2が入力行の最初にマッ チした場合,0,addr2の形式はその範囲の最後になりますが, 1,addr2の形式はその範囲の最初のままです.
`addr1,+N'
addr1addr1に続くN行にマッチします.
`addr1,~N'
addr1と,入力の行番号がNの倍数になるまでのaddr1に続く 行にマッチします.

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


3.2 正規表現の構文の概要

sedの使用方法を知るため,正規表現(短くするとregexp)を理解す べきです.正規表現とは,右から左へならぶ対象文字列に対してマッチするパター ンです.パターン内のほとんどの文字はその文字自身を意味し,対象内の対応す る文字にマッチします.ちょっとした例として以下のパターンを考えます.

 
     The quick brown fox

それは,それと全く同一なサブジェクトの文字列の一部にマッチします.正規表 現のパワーは,パターン内に代入と繰り返しを含めるという能力にあります.そ れらはメタ文字を使用してパターン内にエンコードされ,その文字自身を意味せ ず,特殊な方法で解釈されます.sedで使用される正規表現の構文の短い 記述は以下のようになります.

char
単一文字で,特殊なものでない場合はテキストにマッチします.

*
直前の文字,まとまった正規表現(以下を参照),またはクラスの,ゼロ回以上の 繰り返しにマッチします.

\+
*に似ていますが,一つ以上にマッチします.それはGNUの拡張です.

\?
*に似ていますが,ゼロまたは一つだけにマッチします.れはGNUの拡張で す.

\{i\}
*に似ていますが,正確にi個連続したものにマッチします(iは数字 です.移植性のために0から255の間にしてください).

\{i,j\}
i個以上とj個以下の間の連続にマッチします.

\{i,\}
i個以上の連続にマッチします.

\(regexp\)
全体としてregexpの内部グループにします.以下のように使用されます.

.
あらゆる文字にマッチします.

^
行の最初のヌル文字にマッチし,すなわちキャレットの後にあるものは行の最初 にある必要があります.^#includeは,"#include"が行の最初にあるとこ ろだけにマッチします -- その前に一つか二つのスペースがある場合,マッチ は失敗します.

$
^と同じですが,行の終りを参照します.

[list]
[^list]
list内の単一文字にマッチします.例えば,`[aeiou]'はすべての母 音にマッチします.リストには`char1-char2'のような並びを 含めてもかまわず,それは,char1char2の間(それぞれ含まれま す)のあらゆる文字にマッチします.

キャレットは正規表現の意味を反転し,リスト以外の単一文字にマッチします. リストに`]'を含めるため,それを(必要なキャレットの後の)最初の文字に し,`-'をリストに含めるため,それを最初または最後にしてください. `^'を含めるため,最初の文字より後に書いてください.

regexp1\|regexp2
regexp1またはregexp2にマッチします.複雑な代替正規表現を使用 するためカッコを使用してください.マッチの処理は,それぞれの代替物を左か ら右へ順番に試し,最初に成功したものが使用されます.それはGNUの拡張 です.

\digit
正規表現のdigit番目の\(\)で参照しているものにマッチします.

\char
メタ文字charにマッチします.これは上記で言及されている特殊文字にマッ チさせるために使用されます.移植性があると仮定されるCのようなバックスラッ シュシーケンスは,改行に対する\nだけだということに注意してくださ い.特に\tは,ほとんどのsed実装でタブ文字ではなく`t' にマッチします.

正規表現のマッチは欲張り,つまり二つ以上のマッチが検出された場合は最も長 いものを選択し,二つ以上同じサイズのものを選択した場合はテキストの最初の ものを選択することに注意してください.

例です.

`abcdef'
`abcdef'にマッチします.

`a*b'
ゼロ個以上の`a'に単一の`b'が続くものにマッチします.例えば, `b'や`aaaaab'です.

`a\?b'
`b'や`ab'にマッチします.

`a\+b\+'
一つ以上の`a'に一つ以上の`b'が続くものにマッチします. `ab'はマッチの可能性がある最も短いものですが,それ以外の例として, `aaaab'や`abbbbb'や`aaaaaabbbbbbb'があります.

`.*'
`.\+'
これらの二つは両方とも,行のすべての文字にマッチします.しかし,最初のも のはすべての行(空のものも含む)にマッチしますが,二番目のものは少なくとも 一文字含まれている行のみにマッチします.

`^main.*(.*)'
これは,行の最初が"main"で,開カッコと閉カッコが続く行を探します.隣接す る`n',`(',そして`)'は不要です.

`^#'
これは,ハッシュ(またはシャープ)文字で始まる行にマッチします.

`\\$'
これは単一のバックスラッシュで終る行にマッチします.その正規表現は,エス ケープのために二つのバックスラッシュを含みます.

`\$'
代わりに,これは単一のドル記号にマッチし,それはエスケープされているため です.

`[a-zA-Z_]'
これはあらゆる文字にマッチします.

`[^ tab]\+'
これは,スペースとタブ以外のあらゆる文字が一つ以上連続しているものにマッ チします.通常,これは単語を意味します.

`^\(.*\)\n\1$'
これは,最後の改行以外の二つの同じ行にマッチします.

`A.\{9\}$'
これは,行の最後の十文字が正確に"A"であるものにマッチします.

`^.\{,15\}A'
行の最初の16文字の終りの"A"にマッチします.


3.3 sedがデータをバッファリングする場所

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


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

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

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

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

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

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

`q [exit-code]'
[最大一つのアドレスが可能です.]

それ以上のコマンドも入力も処理せずsedを終了します.自動的な出力が -nスイッチで利用不可能になっていない場合,現在のパターンスペース が出力されることに注意してください.sedスクリプトがからの終了コー ドを返す能力は,GNU sedの拡張です.

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

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

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

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

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

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


3.5 sコマンド

(置換での)sコマンドの構文は, s/regexp/replacement/flagsです./文字は,他の単 一文字をsコマンドで与えることで一様に置換してもかまいません. /文字(または,それの代わりの使用されているその他の文字)は, \文字を前置した場合だけregexpreplacementに書くこと が可能です.

sコマンドは,おそらくsedで最も重要で,様々なオプションが多 くあります.基本的な概念は単純です.sコマンドは,提供されている regexpに対しパターンスペースのマッチを試みます.マッチが成功する場 合.マッチしたパターンスペースの位置がreplacementで置換されます.

replacement\n(nは1から9までの数字で,1と9も含 まれます)での参照を含めることが可能で,それはn番目の\(とそ のマッチと\)に含まれているマッチの位置を参照します.また, replacementに,パターンスペースのマッチ位置全体を参照する,エスケー プされていない&文字を含めることも可能です. 最終的に(これはGNU sedの拡張です),特別なバックスラッシュの並びや文 字LlUuEの一つを含めることが可能です.それぞれの意味は以下のとおり です.\U\Eが見つかるまで小文字に置換します.次の文字を小 文字に置換します.\L\Eが見つかるまで大文字に置換します. 次の文字を大文字に置換します.そして,\L\Uで開始した大文 字小文字の変換を停止します.\&,または改行そのものを最終 的な置換物に含めるため,replacement内の\&,または 改行に必要な\を確実に前置してください.

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

`g'
最初のものだけでなくすべてのregexpへのマッチを置換します.

`number'
regexpnumber番目のマッチのみ置換します.

注意:POSIX.2の標準は,gnumber指示語を混ぜたときに何 が起こるかを指定しておらず,現在はsedの実装上で幅広い同意はありま せん.GNU sedでは,相互作用は以下のように定義しています. number番目のマッチを無視し,number番目からマッチし,すべての マッチを置換します.

`p'
置換が行なわれた場合,新しいパターンスペースを出力します.

注意:peオプションの両方が指定されているとき,二つの順序 に関連して,全く違った結果を生成します.一般的にep(評価して出力) では期待したものになるでしょうが,もう一方の順番はデバッグで役に立つもの になります.この理由は,現在のバージョンのGNU sedが,e前後の pオプションの存在を特別なものとして解釈しますが,sコマンド に対する一般的なフラグはその効果を一度だけ表示するためです.この動作は, ドキュメントには書かれていますが,将来のバージョンでは変更するかもしれま せん.

`w file-name'
置換が行なわれた場合,結果を指名されたファイルに書き出します. GNU sedの拡張として,file-nameの特殊な値をサポートします.結 果を標準エラー出力に書き出す`/dev/stderr',そして標準出力に書き出す `/dev/stdout'です.(3)

`e'
このコマンドで,シェルコマンドからの入力をパターンスペースへのパイプで渡 すことが可能になります.代入が行なわれた場合,パターンスペースで見つかっ たコマンドが実行され,パターンスペースはその出力で置換されます.後置され る改行は抑制されます.実行されたコマンドにnul文字が含まれる場合, 結果は定義されていません.これはGNU sedの拡張です.

`I'
`i'
正規表現にマッチさせるI修飾子はGNUの拡張で,大文字小文字を無 視する方法で,sedregexpにマッチさせます.

`M'
`m'
正規表現のマッチに対するM指示語は,GNU sedの拡張で,^$を(通常の動作に加え),それぞれ改行後の空の文字列と改行前の空の 文字列にマッチさせます.バッファの最初とバッファの最後に常にマッチする特 別な文字の並び(Perlモードの\A\Z,基本または拡張正規表現 モードの\`\')があります.Mmulti-lineを意 味します.


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

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

`v'
このコマンドは何もしませんが,GNU sedの拡張がサポートされていない場 合はsedは異常終了し,それはその他のsedの実装ではそれを実装 していないためです.

`Q [exit-code]'
このコマンドはqと同じですが,パターンスペースの内容を出力しません. qに似ていて,呼び出し側に終了コードを返す能力を提供しています.

この一見些細な機能を達成する唯一の別の方法は,-nオプションを使用 する方法(スクリプトが不必要に複雑になります)や,見た目に影響しないように ファイル全体を読み込むことで時間が無駄になるような以下の断片を利用する方 法なので,このコマンドは役に立ちます.

 
:eat
$d       # Quit silently on the last line
N        # Read another line, silently
g        # Overwrite pattern space each time to save memory
b eat

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

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

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

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

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

GNUの拡張として,aと改行の間に空白と\の連続がある場合, aの後の最初の空白文字以外で始まるこの行のテキストは,textブ ロックの最初の行として受けとられます.(これで,単純に一行のスクリプトを 追加するだけで可能になります.)この拡張は,icコマンドを 用いても動作します.

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

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

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

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

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

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

nは,要求される行を丸める長さを指定します.0(ゼロ)の長さは長い行を 丸めないことを意味します.省略されている場合,コマンドラインで指定されて いるものがデフォルトとして使用されます.nパラメータはGNU sed の拡張です.

`L n'
このGNU sedの拡張は,fmtが行なうように,(最大)n文字の 行の出力を生成するため,パターンスペースの行を補充しつなげます.n が省略されている場合,コマンドラインで指定されているデフォルトを使用しま す.

ブランク行,単語の間のスペース,そして字下げは出力で維持されます.異なる 字下げが連続している入力行はつなげられません.タブは八列に展開されます.

パターンスペースに複数の行が含まれている場合,それらはつなげられますが, パターンスペースは通常単一行を含んでいるので,単純なL;dスクリプト の動作はfmt -sと同じです(すなわち,短い行を長い行の形式につなげま せん).

nは,行を丸める長さを指定することを要求します.省略されている場合, コマンドラインで指定されているデフォルトを使用します.

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

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

GNU sedの拡張として,特殊な値`/dev/stdin'がファイル名としてサ ポートされていて,それは標準入力の内容を読み込みます.

`R filename'
filenameの行を読み込み,,現在のサイクルの終りや次の入力行が読み込 まれたときに出力ストリームに挿入するためキューに保存します. filenameが読み込み不可能,またはファイルの終りに達した場合,エラー を示すことなく行が追加されないことに注意してください.

rコマンド同様,特殊な値`/dev/stdin'がファイル名としてサポー トされていて,それは標準入力の内容を読み込みます.

`w filename'
パターンスペースをfilenameに書き出します.GNU sedの拡張として, file-nameとして二つの特殊な値がサポートされています. `/dev/stderr'は結果を標準エラー出力に書き出し,`/dev/stdout'は 標準出力に書き出します.(4)

最初の入力行が読み込まれる前に,ファイルは作成され(または切り詰められ)ま す.同じfilenameを参照するすべてのwコマンドは(sコマ ンド成功時のwフラグのインスタンスを含めて),ファイルを閉じ再び開 くこと無く出力されます.

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

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

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

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

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

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

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

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


3.7 sedのベテランプログラマのためのコマンド

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

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

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

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

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

`T label'
前回の入力行の読み込みや条件分岐が行なわれてから,sの置換で成功し なかったものがある場合のみlabelに分岐します.labelは省略可能 で,その場合は次のサイクルが開始されます.


3.8 GNU sed特有のコマンド

以下のコマンドはGNU sed特有なので,注意して使用する必要があり,移植 性の邪魔になると分かっているときだけ使用することはそう悪いものではありま せん.それらでGNU sedの拡張を調査したり,標準的なsedではまだ サポートされていないが,よく要求される作業を行なうことが可能になります.

v
このコマンドは何もしませんが,GNU sedの拡張がサポートされていない場 合はsedは異常終了し,それはその他のsedの実装ではそれを実装 していないためです.

Q [exit-code]
このコマンドはqと同じですが,パターンスペースの内容を出力しません. qに似ていて,呼び出し側に終了コードを返す能力を提供しています.

この一見些細な機能を達成する唯一の別の方法は,-nオプションを使用 する方法(スクリプトが不必要に複雑になります)や,見た目に影響しないように ファイル全体を読み込むと時間が無駄になるような以下の断片を利用する方法な ので,役に立つはずです.

 
:eat
$d       # Quit silently on the last line
N        # Read another line, silently
g        # Overwrite pattern space each time to save memory
b eat

T label
前回の入力行の読み込みや条件分岐が行なわれてから,sの置換で成功し なかったものがある場合のみlabelに分岐します.labelは省略可能 で,その場合は次のサイクルが開始されます.

e [command]
このコマンドで,シェルコマンドからの入力をパターンスペースへのパイプで渡 すことが可能になります.パラメータを用いていない場合,eコマンドは パターンスペースで見つかったコマンドを実行し,パターンスペースを出力で置 換します.後置される改行は抑制されます.

パラメータが指定されている場合は,代わりにeコマンドがそれをコマン ドとして解釈し,(rが行なうように)それを出力ストリームに送ります. そのコマンドは,最後の終りがバックスラッシュでない限り,複数の行を跨って 実行することが可能です.

いずれの場合でも,実行されたコマンドにnul文字が含まれる場合,結果 は定義されていません.

W filename
最初の改行までのパターンスペースの位置を与えられたfilenameに書き出 します.ここでのファイル処理はwコマンドですべて述べています.

L n
このGNU sedの拡張は,fmtが行なうように,(最大)n文字の 行の出力を生成するため,パターンスペースの行を補充しつなげます.n が省略されている場合,コマンドラインで指定されているデフォルトを使用しま す.

ブランク行,単語の間のスペース,そして字下げは出力で維持されます.異なる 字下げが連続している入力行はつなげられません.タブは八列に展開されます.

パターンスペースに複数の行が含まれている場合,それらはつなげられますが, パターンスペースは通常単一行を含んでいるので,単純なL;dスクリプト の動作はfmt -sと同じです(すなわち,短い行を長い行の形式につなげま せん).

nは,行を丸める長さの指定を要求します.省略されている場合,コマン ドラインで指定されているデフォルトを使用します.

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

rコマンド同様,特殊な値`/dev/stdin'がファイル名としてサポー トされていて,それは標準入力の内容を読み込みます.


3.9 正規表現でのエスケープに関するGNUの拡張

この章まで,sedにキャレットを特殊文字でなく文字通りに解釈するよう に伝える`\^'の形式のエスケープだけを見てきました.例えば,`\*' はゼロ以上のバックスラッシュでは無く単一のアスタリスクにマッチします.

この章では,他の種類のエスケープを紹介します(5) -- すなわち,通常の文字や文字の連続に適用されるエスケー プは文字通りに受けとられ,sedは特殊文字で置換します.これは,パター ンスペースの印刷不可能な文字を目に見える方法でエンコードする方法を提供し ます.sedスクリプト内での印刷不可能な文字の存在に制限はありません が,スクリプトがシェルやテキストの編集で準備されるとき,バイナリ文字で表 現するより,以下のエスケープシーケンスの一つを使用する方が通常は簡単です.

これらのエスケープのリストは以下にあります.

`\a'
BEL文字を生成またはそれにマッチし,それは"アラート"(ASCII 7) です.

`\f'
フォームフィードを生成またはそれにマッチします(ASCII 12).

`\n'
改行を生成またはそれにマッチします(ASCII 10).

`\r'
キャリッジリターンを生成またはそれにマッチします(ASCII 13).

`\t'
水平タブを生成またはそれにマッチします(ASCII 9).

`\v'
"垂直タブ"と呼ばれるものを生成またはそれにマッチします(ASCII 11).

`\cx'
CONTROL-xを生成またはそれにマッチし,xは任意の文 字です.`\cx'の明確な効果は以下のようになります.xが小 文字の場合,それは大文字に変換されます.文字のビットの6(16進数の40)が反 転します.このため,"\cz"は16進数の1Aになりますが,`\c{'は16進数の 3Bになり,`\c;' は16進数の7Bになります.

`\dxxx'
十進数のASCII値がxxxの文字を生成またはそれにマッチします.

`\oxxx'
八進数のASCII値がxxxの文字を生成またはそれにマッチします.

`\xxx'
16進数のASCII値がxxの文字を生成またはそれにマッチします.

`\b'(バックスラッシュ)は,既存の"単語の境界"の意味と衝突するので削 除されています.

それ以外のエスケープは特定の文字集合にマッチし,正規表現内だけで有効です.

`\s'
空白文字にマッチします.

`\S'
空白文字以外の文字にマッチします.

`\w'
あらゆる"単語"文字にマッチします."単語"文字とはすべての文字と数字と アンダースコアです.

`\W'
"単語以外"の文字にマッチします.


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

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