[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

3. SEDプログラム

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=sed-ja&node=sed+Programs"
"sed/SEDプログラム"へのコメント(無し)

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

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



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

3.1 sedが動作する様子

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=sed-ja&node=Execution+Cycle"
"sed/sedが動作する様子"へのコメント(無し)

sedは二つのデータバッファを管理しています.アクティブな パターン空間と補助的なホールド空間です.両方とも最初は空 です.

sedは,入力行単位で以下のサイクルを実行することで処理を実行し ます.最初にsedは入力ストリームから一行読み込み,くっついてい る改行を削除し,そしてそれをパターン空間に配置します.そして,コマンド が実行されます.それぞれのコマンドには実行するものに関連付けされたアド レスがあります.アドレスとは条件コードの一種で,コマンドが実行される前 に条件が合致している場合のみコマンドは実行されます.

スクリプトが終わると,`-n'オプションが使用されていないかぎり,パ ターン空間の内容が出力ストリームに出力され,削除されないかぎり改行が最 後に追加されます.(3)そして,次のサイクルでは次の入力行から開始します.

(`D'のような)特殊コマンドが使用されていないかぎり,パターン空間は 二つのサイクルの間に削除されます.一方,ホールド空間はサイクル間でデー タを保持します(両方のバッファ間でデータを移動するコマンド`h', `H',`x',`g',`G'を参照してください).



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

3.2 sedで行を選択する

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=sed-ja&node=Addresses"
"sed/sedで行を選択する"へのコメント(無し)

sedスクリプトのアドレスは,以下の形式のいずれかになります.

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

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

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

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

空の正規表現`//'は,前回の正規表現に繰り返しマッチします(それは, 空の正規表現がsコマンドに渡されても同じです).正規表現を編集する と,正規表現がコンパイルされるときに評価されるので,空の正規表現ととも にそれらを指定することは不正な処理になることに注意してください.

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

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

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

/regexp/M
\%regexp%M
正規表現のマッチに対するM指示語は,GNU sedの拡張で, ^$を(通常の動作に加え)それぞれ改行後の空の文字列と改行 前の空の文字列にマッチさせます.これらは特殊文字のならびです.

(\`\') それは,バッファの最初と最後にマッチします.M

multi-line
を意味します.

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

アドレスの範囲はカンマ(,)で分けられている二つのアドレスで指定す ることで指定することが可能です.アドレスの範囲は最初のアドレスにマッチ している行から始まり,二番目のアドレス(これは含まれます)にマッチするま で続きます.

二番目のアドレスがregexpの場合,マッチの終りの調査は,最初のアド レスにマッチした行の次の行から開始されます.範囲は常に少なくとも 二行になります(入力ストリームが終わる場合はもちろん例外です).

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

GNU sedも特殊な二つのアドレス形式をサポートしています.これらはす べてGNUの拡張です.

0,/regexp/
sedが最初の入力行でもregexpへのマッチを試みるように, 0,/regexp/のように,アドレス指定で行番号の0を使用す ることが可能です.言い替えると,0,/regexp/1,/regexp/に似ていますが,addr2が入力の最初の行にマッ チする場合,0,/regexp/の形式では範囲の終わりだと考慮されま すが,一方1,/regexp/の形式ではその範囲の最初にマッチするの で,正規表現が二番目にマッチするのが見つかるまで範囲が広げられま す.

これは,0のアドレスに意味がある場所だけだということに注意してく ださい.0番目の行はなく,それ以外の方法では,0のアドレスに該当す るコマンドはエラーとなります.

addr1,+N
addr1addr1に続くN行にマッチします.

addr1,~N
addr1と,入力の行番号がNの倍数になるまでのaddr1に続く 行にマッチします.

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



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

3.3 正規表現の構文の概要

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=sed-ja&node=Regular+Expressions"
"sed/正規表現の構文の概要"へのコメント(無し)

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

 
     The quick brown fox

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

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

*
直前の正規表現のゼロ回以上の繰り返しにマッチし,それは普通の文字, \が前置されている特殊な文字,.,正規表現のグループ(以下を 参照),括弧でくくられた表現です.GNUの拡張として,正規表現の 語尾に*を続けることも可能です.例えば,a**a*と等 価です.POSIX 1003.1-2001では,*が正規表現やサブ正規表 現の先頭にある場合には,その文字自身を意味するとされていますが, GNU以外での実装では,ほとんどもものがこれをサポートしていない ので,移植性の高いスクリプトでは,このときには代わりに\*を使用し てください.

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

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

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

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

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

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

.
改行を含む,あらゆる文字にマッチします.

^
行の最初のヌル文字にマッチし,すなわちサーカムフレクスの後にあるものは 行の先頭にある必要があります.^#includeは,"#include"が行の最初 にあるところだけにマッチします -- その前に一つか二つのスペースがある場 合,マッチは失敗します.^は,正規表現や部分正規表現の最初(すなわ ち,\(\|の後)にある場合のみ特殊文字として動作します.移 植性の高いスクリプトでは,部分正規表現の最初で^を使用するのは避 けるべきで,それはPOSIXでは,^を文章内の通常の文字とし て扱う実装も許可しているためです.

$
^と同じですが,行の終りを参照します.$も,正規表現や部分 正規表現の最後(すなわち,\)\|の後)にある場合のみ特殊文 字として動作し,部分正規表現の最後での利用には移植性がありません.

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

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

文字$*.[,そして\は,通常は list内で特殊文字にはなりません.例えば[\*]は,この状況では \が特殊文字ではないので,`\'にも`*'にもマッチします. しかし,[.ch.][=a=],そして[:space:]のような文字 列はlist内で特殊扱いされ,対応するシンボル,等価のクラス,そして 文字クラスにそれぞれ対応するので,後に.=,または :が続く[list内で特殊扱いされます. POSIXLY_CORRECTモードでないときも,\n\tのような特 殊なエスケープはlist内で認識されます.See 節 3.9 正規表現でのエスケープに関するGNUの拡張.

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

regexp1regexp2
regexp1regexp2が連結しているものにマッチします.結合具合 は\|^,そして$より綿密になりますが,それ以外の正 規表現オペレータよりは弱くなります.

\digit
正規表現のdigit番目の\(...\)の括弧付き部分正規表現にマッ チします.これは,後方参照(back reference)と呼ばれています.部分 正規表現は,左から右の出現順に数えた番号が暗黙に指定されます.

\n
改行文字にマッチします.

\char
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-Z0-9]'
Cロカールでは,これはあらゆるASCII文字と数字にマッチします.

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

`^\(.*\)\n\1$'
これは,改行で分離されている二つの同じ部分文字列から成り立つ文字列にマッ チします.

`.\{9\}A$'
これは,`A'が後置されている九文字にマッチします.

`^.\{15\}A'
これは16文字含まれている文字列ではじまり,最後が`A'のものみマッチ します.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

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

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=sed-ja&node=Common+Commands"
"sed/よく使用されるコマンド"へのコメント(無し)

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

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

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

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

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

q [exit-code]
このコマンドは一つのアドレスだけ受け入れます.

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

d
パターン空間を削除します.すぐに次のサイクルを開始します.

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

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

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



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

3.5 sコマンド

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=sed-ja&node=The+%22s%22+Command"
"sed/sコマンド"へのコメント(無し)

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

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

replacement\n(nは1から9までの数字で,1と9も 含まれます)での参照を含めることが可能で,それはn番目の\(と そのマッチと\)に含まれているマッチの位置を参照します.また, replacementに,パターン空間のマッチ位置全体を参照する,エスケープ されていない&文字を含めることも可能です.

最後に(これはGNU sedの拡張です),特別なバックスラッシュのシーケン スと文字LlUu,またはEの一つを 含めることが可能です.それぞれの意味は以下のとおりです.

\L
\U\Eが見つかるまで小文字に置換します.

\l
次の文字を小文字に置換します.

\U
\L\Eが見つかるまで大文字に置換します.

\u
次の文字を大文字に置換します.

\E
\L\Uで開始した大文字小文字の変換を停止します.

\&,または改行そのものを最終的な置換物に含めるため, replacement内の\&,または改行に必要な\を確 実に前置してください.

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

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

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

注意:POSIXの標準は,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'です.(4)

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

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

M
m
正規表現のマッチに対するM指示語は,GNU sedの拡張で, ^$を(通常の動作に加え),それぞれ改行後の空の文字列と改 行前の空の文字列にマッチさせます.特殊な文字の並びがあります.

(\`\') これらは常にバッファの最初または最後にマッチします.M

multi-line
を意味します.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

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

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=sed-ja&node=Other+Commands"
"sed/あまり使用されないコマンド"へのコメント(無し)

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

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

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

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

a\
text
GNUの拡張として,このコマンドは二つのアドレスを受け入れます.

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

textのエスケープシーケンスは処理されるので,単一のバックスラッシュ を出力するため,text\\を使用してください.

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

i\
text
GNUの拡張として,このコマンドは二つのアドレスを受け入れます.

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

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

=
GNUの拡張として,このコマンドは二つのアドレスを受け入れます.

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

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

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

r filename
GNUの拡張として,このコマンドは二つのアドレスを受け入れます.

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

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

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

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

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

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

P
パターン空間の位置を最初の改行まで出力します.

h
ホールド空間の内容をパターン空間の内容で置換します.

H
ホールド空間の内容に改行を後置した後,パターン空間の内容をホールド空間 に後置します.

g
パターン空間の内容をホールド空間の内容で置換します.

G
パターン空間の内容に改行を後置した後,ホールド空間の内容をパターン空間 に後置します.

x
ホールド空間とパターン空間の内容を入れ換えます.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

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

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=sed-ja&node=Programming+Commands"
"sed/sedのベテランプログラマのためのコマンド"へのコメント(無し)

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

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

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

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

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



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

3.8 GNU sed特有のコマンド

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=sed-ja&node=Extended+Commands"
"sed/GNUsed特有のコマンド"へのコメント(無し)

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

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

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

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

L n
このGNU sedの拡張は,fmtが行なうように,(最大)n文字の 行の出力を生成するため,パターン空間の行を補充しつなげます.nが省 略されている場合,コマンドラインで指定されているデフォルトを使用します. このコマンドの試みは失敗だと思っていて,要求が無ければ(きっと無いでしょ うけど)将来のバージョンでは削除する予定です.

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

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

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

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

v version
このコマンドは何もしませんが,GNU sedの拡張がサポートされていない 場合はsedは異常終了し,それはその他のsedの実装では それを実装していないためです.さらに,4.0.5の様に,スクリプトが 要求するsedのバージョンを指定することもかのうです.デフォルト は4.0で,それは,このコマンドが実装された最初のバージョンだから です.

このコマンドは,POSIXLY_CORRECTが環境変数で設定されている場合でも, すべてのGNU extensionsを利用可能にします.

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



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

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

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=sed-ja&node=Escapes"
"sed/正規表現でのエスケープに関するGNUの拡張"へのコメント(無し)

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

この章では,他の種類のエスケープを紹介します(6) -- すなわち,通常の文字や文字の連続に適用さ れるエスケープは文字通りに受けとられ,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'(バックスラッシュ)は,既存の"単語の境界"の意味と衝突するので削 除されています.

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

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

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

\b
単語の境界にマッチします.つまり,左が"単語"の文字になっている文字と, 右が"単語以外"の文字になっている文字,またはその逆にマッチします.

\B
単語の境界ならどこにでもマッチします.つまり,文字の左と文字の右の両方 が"単語"または"単語以外"のいずれかの場合にマッチします.

\`
パターンスペースの最初だけにマッチします.これは,複数行モードの ^とは異なります.

\'
パターンスペースの最後だけにマッチします.これは,複数行モードの $とは異なります.


[ << ] [ >> ]           [表紙] [目次] [索引] [検索] [上端 / 下端] [?]