[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
sed
プログラムは,一つ以上のsed
コマンド,一つ以上の `-e',`-f',`--expression',そして`--file' オプション,またはこれらのオプションが使用されていない場合は最初のオプ ションではない引数で渡されるものから成り立っています.このドキュメント は"その" sed
スクリプトを記述します.渡されるscriptと script-fileを全て連結したものの意味はこれで理解できるでしょう.
それぞれのsed
コマンドは,オプションのアドレスやアドレスの範囲 から成り立っていて,それには一文字のコマンド名とさらにコマンド特有のコー ドが続きます.
3.1 sed
が動作する様子How sed
works3.2 sed
で行を選択するSelecting lines with sed
3.3 正規表現の構文の概要 Overview of regular expression syntax 3.4 よく使用されるコマンド Often used commands 3.5 s
コマンドsed
's Swiss Army Knife3.6 あまり使用されないコマンド Less frequently used commands 3.7 sed
のベテランプログラマのためのコマンドCommands for sed
gurus3.8 GNU sed
特有のコマンドCommands specific of GNU sed
3.9 正規表現でのエスケープに関するGNUの拡張 Specifying special characters
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
sed
が動作する様子sed
が動作する様子"へのコメント(無し)
sed
は二つのデータバッファを管理しています.アクティブな パターン空間と補助的なホールド空間です.両方とも最初は空 です.
sed
は,入力行単位で以下のサイクルを実行することで処理を実行し ます.最初にsed
は入力ストリームから一行読み込み,くっついてい る改行を削除し,そしてそれをパターン空間に配置します.そして,コマンド が実行されます.それぞれのコマンドには実行するものに関連付けされたアド レスがあります.アドレスとは条件コードの一種で,コマンドが実行される前 に条件が合致している場合のみコマンドは実行されます.
スクリプトが終わると,`-n'オプションが使用されていないかぎり,パ ターン空間の内容が出力ストリームに出力され,削除されないかぎり改行が最 後に追加されます.(3)そして,次のサイクルでは次の入力行から開始します.
(`D'のような)特殊コマンドが使用されていないかぎり,パターン空間は 二つのサイクルの間に削除されます.一方,ホールド空間はサイクル間でデー タを保持します(両方のバッファ間でデータを移動するコマンド`h', `H',`x',`g',`G'を参照してください).
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
sed
で行を選択するsed
で行を選択する"へのコメント(無し)
sed
スクリプトのアドレスは,以下の形式のいずれかになります.
number
sed
は, `-i'や`-s'オプションが指定されていない限り,入力ファイル 全体に渡って,連続して行を数えることに注意してください.)
first~step
$
/regexp/
/
文字が含まれる場合,それぞれバックスラッシュ(\
)でエス ケープする必要があります.
空の正規表現`//'は,前回の正規表現に繰り返しマッチします(それは, 空の正規表現がs
コマンドに渡されても同じです).正規表現を編集する と,正規表現がコンパイルされるときに評価されるので,空の正規表現ととも にそれらを指定することは不正な処理になることに注意してください.
\%regexp%
%
は他の任意の単一の文字で置換してもかまいません.)
これは正規表現regexpにもマッチしますが,これで/
以外の分離 文字を使用することが可能になります.regexp自身が大量の/
を 含んでいる場合,個々の/
をエスケープするのも退屈なので,それを避 けるとき特に役に立ちます.regexp自身が分離文字を含んでいる場合, それぞれをバックスラッシュ(\
)でエスケープする必要があります.
/regexp/I
\%regexp%I
I
指示語はGNUの拡張で,それによ りregexpは大文字小文字を無視してマッチします.
/regexp/M
\%regexp%M
M
指示語は,GNU sed
の拡張で, ^
と$
を(通常の動作に加え)それぞれ改行後の空の文字列と改行 前の空の文字列にマッチさせます.これらは特殊文字のならびです.
(\`
と\'
) それは,バッファの最初と最後にマッチします.M
は
アドレスが与えられていない場合,全ての行がマッチします.一つのアドレス が与えられている場合,マッチする行はアドレスがマッチしたものだけになり ます.
アドレスの範囲はカンマ(,
)で分けられている二つのアドレスで指定す ることで指定することが可能です.アドレスの範囲は最初のアドレスにマッチ している行から始まり,二番目のアドレス(これは含まれます)にマッチするま で続きます.
二番目のアドレスが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
addr1,~N
アドレス指定の終りに!
文字を後置すると,マッチの意味が否定されま す.すなわち,!
がアドレスの範囲に続いている場合,選択されたアド レスの範囲にマッチしない行だけが選択されます.これは一つのアドレ スに対しても動作し,おそらくひねくれているだけでしょうが,何もないアド レスに対しても動作します.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
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,\}
\(regexp\)
.
^
^#include
は,"#include"が行の最初 にあるところだけにマッチします -- その前に一つか二つのスペースがある場 合,マッチは失敗します.^
は,正規表現や部分正規表現の最初(すなわ ち,\(
や\|
の後)にある場合のみ特殊文字として動作します.移 植性の高いスクリプトでは,部分正規表現の最初で^
を使用するのは避 けるべきで,それはPOSIXでは,^
を文章内の通常の文字とし て扱う実装も許可しているためです.
$
^
と同じですが,行の終りを参照します.$
も,正規表現や部分 正規表現の最後(すなわち,\)
や\|
の後)にある場合のみ特殊文 字として動作し,部分正規表現の最後での利用には移植性がありません.
[list]
[^list]
前置される^
は正規表現の意味を反転するので,listにな い単一文字にマッチします.リストに`]'を含めるため,それを(必要な ^
の後の)最初の文字にし,`-'をリストに含めるため,それを最初 または最後にしてください.`^'を含めるため,最初の文字より後に書い てください.
文字$
,*
,.
,[
,そして\
は,通常は list内で特殊文字にはなりません.例えば[\*]
は,この状況では \
が特殊文字ではないので,`\'にも`*'にもマッチします. しかし,[.ch.]
,[=a=]
,そして[:space:]
のような文字 列はlist内で特殊扱いされ,対応するシンボル,等価のクラス,そして 文字クラスにそれぞれ対応するので,後に.
,=
,または :
が続く[
はlist内で特殊扱いされます. POSIXLY_CORRECT
モードでないときも,\n
と\t
のような特 殊なエスケープはlist内で認識されます.See 節 3.9 正規表現でのエスケープに関するGNUの拡張.
regexp1\|regexp2
regexp1regexp2
\|
,^
,そして$
より綿密になりますが,それ以外の正 規表現オペレータよりは弱くなります.
\digit
\(...\)
の括弧付き部分正規表現にマッ チします.これは,後方参照(back reference)と呼ばれています.部分 正規表現は,左から右の出現順に数えた番号が暗黙に指定されます.
\n
\char
$
,*
,.
, [
,\
,または^
の一つです.移植性があると仮定可能な Cのようなバックスラッシュシーケンスは,改行に対する\n
と \\
だということに注意してください.特に\t
は移植性がなく, ほとんどのsed
実装でタブ文字ではなく`t'にマッチします.
正規表現のマッチは欲張りで,つまりマッチは左から右に試みられ,二つ以上 のマッチが同じ文字から開始される場合は,その最も長いものを選択すること に注意してください.
例です.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
本当にsed
を使用するのなら,きっとこれらのコマンドを知りたいと 思うでしょう.
#
#
文字ははコメントを開始します.コメントは次の改行まで続きます.
移植性を心配している場合,sed
(POSIXに準拠していないも の)の実装によっては,単一の一行のコメントのみサポートしていて,スクリプ トの最初の文字が#
のときだけサポートしている可能性があることを覚 えておいてください.
警告:sed
スクリプトの最初の二文字が#n
の場合, `-n' (自動的に出力しない)オプションが強制的に使用されます.スク リプトの最初の行にコメントを書き,そしてコメントを文字`n'で開始し たい場合で,このように動作して欲しくない場合は,大文字の`N'を使用 するか,`n'の前に少なくとも一つのスペースを書いてください.
q [exit-code]
それ以上のコマンドも入力も処理せずsed
を終了します.自動的な出 力が`-n'スイッチで利用不可能になっていない場合,現在のパターン空 間が出力されることに注意してください.sed
スクリプトが終了コー ドを返す能力は,GNU sed
の拡張です.
d
p
n
sed
はそれ以上のコマンドを処理せずに終了します.
{ commands }
{
文字と}
文字で囲んでもかまいませ ん.コマンドのグループを,単一のアドレス(またはアドレスの範囲)にマッチ したところで開始したいとき,これは特に役に立ちます.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
s
コマンドs
コマンド"へのコメント(無し)
(置換での)s
コマンドの構文は, `s/regexp/replacement/flags'です./
文字は, 他の単一文字をs
コマンドで与えることで一様に置換してもかまいませ ん./
文字(または,それの代わりの使用されているその他の文字)は, \
文字を前置した場合だけregexpやreplacementに書くこと が可能です.
s
コマンドは,おそらくsed
で最も重要で,様々なオプション が多くあります.基本的な概念は単純です.s
コマンドは,提供されて いるregexpに対しパターン空間のマッチを試みます.マッチが成功する 場合.マッチしたパターン空間の位置がreplacementで置換されます.
replacementに\n
(nは1から9までの数字で,1と9も 含まれます)での参照を含めることが可能で,それはn番目の\(
と そのマッチと\)
に含まれているマッチの位置を参照します.また, replacementに,パターン空間のマッチ位置全体を参照する,エスケープ されていない&
文字を含めることも可能です.
最後に(これはGNU sed
の拡張です),特別なバックスラッシュのシーケン スと文字L
,l
,U
,u
,またはE
の一つを 含めることが可能です.それぞれの意味は以下のとおりです.
\L
\U
や\E
が見つかるまで小文字に置換します.
\l
\U
\L
や\E
が見つかるまで大文字に置換します.
\u
\E
\L
や\U
で開始した大文字小文字の変換を停止します.\
,&
,または改行そのものを最終的な置換物に含めるため, replacement内の\
,&
,または改行に必要な\
を確 実に前置してください.
s
コマンドにはゼロ以上の下記のflagsを続けることが可能です.
g
number
注意:POSIXの標準は,g
とnumber指示語を混ぜたときに生 じることを指定しておらず,現在はsed
の実装上で幅広い同意はあり ません.GNU sed
では,相互作用を以下のように定義しています. number番目までのマッチを無視し,number番目からマッチしした すべてのマッチを置換します.
p
注意:p
とe
オプションの両方が指定されているとき,二つの順 序に関連して,全く異なる結果を生成します.一般的に,ep
(評価して 出力)では期待したものになるでしょうが,もう一方の順番はデバッグで役に立 つものになります.この理由は,現在のバージョンのGNU sed
が, e
前後のp
オプションの存在を特別なものとして解釈しますが, s
コマンドに対する一般的なフラグはその効果を一度だけ表示するため です.この動作は,ドキュメントには書かれていますが,将来のバージョンで は変更するかもしれません.
w file-name
sed
の拡張として,file-nameの特殊な値をサポートします.結 果を標準エラー出力に書き出す`/dev/stderr',そして標準出力に書き出 す`/dev/stdout'です.(4)
e
sed
の拡張です.
I
i
I
指示語はGNUの拡張で,大文字小文 字を無視する方法で,sed
にregexpにマッチさせます.
M
m
M
指示語は,GNU sed
の拡張で, ^
と$
を(通常の動作に加え),それぞれ改行後の空の文字列と改 行前の空の文字列にマッチさせます.特殊な文字の並びがあります.
(\`
と\'
) これらは常にバッファの最初または最後にマッチします.M
は
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
前のセクションのものより使用されることはおそらく少ないでしょうが,非常 にわずかな有用なsed
スクリプトには,以下のコマンドを組み込むこ とも可能です.
y/source-chars/dest-chars/
/
文字は,y
コマンドで与えられるその他の単一文字で一律に置 換してもかまいません.)
source-charsにマッチしたパターン空間のすべての文字を,対応する dest-charsの文字に変換します.
/
(またはそのかわりに使用されている文字),\
,または改行の インスタンスは,それぞれのインスタンスに\
でエスケープを提供する ことでsource-charsやdest-charsのリストに書くことが可能です. source-charsとdest-charsのリストには,(エスケープを取り除く と)同じ数の文字を含める必要があります.
a\
text
このコマンドに続いているテキストの行(最後が\
で終っているものは, 出力から取り除かれます)を,現在のサイクルの終りや,次の入力行が読み込ま れるときに出力されるキューに保存します.
textのエスケープシーケンスは処理されるので,単一のバックスラッシュ を出力するため,textで\\
を使用してください.
GNUの拡張として,a
と改行の間に連続した空白と\
が ある場合,a
の後に最初の空白文字以外で始まるこの行のテキストは, textブロックの最初の行として受けとられます.(これで,単純に一行の スクリプトを追加するだけで可能になります.)この拡張は,i
と c
コマンドを用いても動作します.
i\
text
c\
text
\
で終っているものは,出力から取り除かれます)を,最後 の行の位置(または,アドレスが指定されていない場合はそれぞれの行の位置) に出力します.新しいサイクルは,パターン空間が削除されてから,このコマ ンド終了後に開始されます.
=
l n
\
文字) は,Cの形式でエスケープされた様式で出力されます.長い行は分割を示す \
を後置して分割されます.それぞれの行の終りには$
で印が付 きます.
nは,要求される行を丸める長さを指定します.0(ゼロ)の長さは長い行 を丸めないことを意味します.省略されている場合,コマンドラインで指定さ れているものがデフォルトとして使用されます.nパラメータは GNU sed
の拡張です.
r filename
filenameの内容を読み込み,現在のサイクルの終りや次の入力行が読み 込まれたときに出力ストリームに挿入するためキューに保存します. filenameが読み込み不可能な場合,エラーを示すことなく空のファイル が読み込まれているかのように扱われることに注意してください.
GNU sed
の拡張として,特殊な値`/dev/stdin'がファイル名としてサ ポートされていて,それは標準入力の内容を読み込みます.
w filename
sed
の拡張として, file-nameとして二つの特殊な値がサポートされています. `/dev/stderr'は結果を標準エラー出力に書き出し,`/dev/stdout' は標準出力に書き出します.(5)
最初の入力行が読み込まれる前に,ファイルは作成され(または切り詰められ) ます.同じfilenameを参照するすべてのw
コマンドは(s
コ マンド成功時のw
フラグのインスタンスを含めて),ファイルを閉じ再び 開くこと無く出力されます.
D
N
sed
は終了し,それ以上のコマンドを処理し ません.
P
h
H
g
G
x
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
sed
のベテランプログラマのためのコマンドsed
のベテランプログラマのためのコマンド"へのコメント(無し)
ほとんどの状況で,これらのコマンドを使用するよりは,おそらくawk
やPerlのようなものでプログラムをした方が良いでしょう.しかし,時には sed
に執念を燃やす人もいて,これらのコマンドで全く複雑なスクリ プトを書くことも可能になります.
: label
b label
t label
s
の置換で成功 したしたものがある場合だけ,labelに分岐します.labelは省略 可能で,その場合は次のサイクルが開始されます.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
sed
特有のコマンドsed
特有のコマンド"へのコメント(無し)
以下のコマンドはGNU sed
特有なので,注意して使用する必要があり,移 植性の邪魔が問題ないことが分かっているときだけ使用してください.それで GNU sed
の拡張を調査したり,標準的なsed
ではまだサポートさ れていないが,よく要求される作業を行なうことが可能になります.
e [command]
e
コマンドはパ ターン空間で見つかったコマンドを実行し,パターン空間を出力で置換します. 後置される改行は抑制されます.
パラメータが指定されている場合は,代わりにe
コマンドがそれをコマ ンドとして解釈し,(r
が行なうように)それを出力ストリームに送りま す.そのコマンドは,最後の終りがバックスラッシュでない限り,複数の行を 跨って実行することが可能です.
いずれの場合でも,実行されたコマンドにNUL文字が含まれる場合,結果 は定義されていません.
L n
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
r
コマンド同様,特殊な値`/dev/stdin'がファイル名としてサポー トされていて,それは標準入力の内容を読み込みます.
T label
s
の置換で成功 しなかったものがある場合だけlabelに分岐します.labelは省略 可能で,その場合は次のサイクルが開始されます.
v version
sed
の拡張がサポートされていない 場合はsed
は異常終了し,それはその他のsed
の実装では それを実装していないためです.さらに,4.0.5
の様に,スクリプトが 要求するsed
のバージョンを指定することもかのうです.デフォルト は4.0
で,それは,このコマンドが実装された最初のバージョンだから です.
このコマンドは,POSIXLY_CORRECT
が環境変数で設定されている場合でも, すべてのGNU extensionsを利用可能にします.
W filename
w
コマンドですべて述べています.[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
この章まで,sed
にキャレットを特殊文字でなく文字通りに解釈する ように伝える`\^'の形式のエスケープだけを見てきました.例えば, `\*' はゼロ以上のバックスラッシュでは無く単一のアスタリスクにマッ チします.
この章では,他の種類のエスケープを紹介します(6) -- すなわち,通常の文字や文字の連続に適用さ れるエスケープは文字通りに受けとられ,sed
は特殊文字で置換しま す.これは,パターン空間の印刷不可能な文字を目に見える方法でエンコード する方法を提供します.sed
スクリプト内での印刷不可能な文字の存 在に制限はありませんが,スクリプトがシェルやテキストの編集で準備される とき,バイナリ文字で表現するより,以下のエスケープシーケンスの一つを使 用する方が通常は簡単です.
以下は、これらのエスケープのリストです.
\a
\f
\n
\r
\t
\v
\cx
\dxxx
\oxxx
\xxx
`\b'(バックスラッシュ)は,既存の"単語の境界"の意味と衝突するので削 除されています.
それ以外のエスケープは特定の文字集合にマッチし,正規表現内だけで有効で す.
\w
\W
\b
\B
\`
^
とは異なります.
\'
$
とは異なります.
[ << ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |