sed による置換
置換
sed -e ’s/original/replacement/g’ file
g: ホールドスペースをパターンスペースに一括追加/コピーする。
sed
による置換は、非常に有益なコマンドです。ファイル内の特定のフレーズを一括置換することができます。
以下 # man sed の抜粋です。
sed はストリームエディタである。ストリームエディタは、入力ストリーム (ファイルまたはパイプラインからの入力) に対して基本的なテキスト変換を行うために用いられる。 sed は編集スクリプトを使える (ed のような) エディタといろいろな面で似ているが、 sed は入力に対して 1 パスだけで動作するので、より効率的である。ま た、 sed はパイプラインのテキストに対してフィルタ動作を行うことができ、この点は他のタイプのエディタとはっきり違います。
オプション
sed の起動時には以下のコマンドラインオプションを指定できる。
–version
sed のバージョン・著作権表示を出力し、終了する。
–help コマンドラインオプションを簡単にまとめた利用法とバグレポート先のアドレスを出力し、終了する。
-n
–quiet
–silent
デ フォルトでは、 sed はスクリプトの各サイクルの最後でパターンスペースの内容を出力する。これらのオプションを指定するとこの自動的な出力が行われなくな り、 p コマンドで出力することを指定された場合に限って sed は出力を生成する。
-e script
–expression=script
script のコマンドを、入力の処理中に行われるコマンドセットに追加する。
-f script-file
–file=script-file
ファイル script-file に含まれるコマンドを、入力の処理中に行われるコマンドセットに追加する。
-e, -f, –expression, –file などのオプションがコマンドラインから全く与えられなかった場合は、コマンドラインの引き数のうち、オプションでない最初 の も の が
script として受け取られ、実行される。
以上のコマンドラインパラメータを処理したあとに引き数が残った場合は、それらは処理対象となる入力ファイルのファイル名と解釈される。 - というファイル名は、標準入力ストリームを参照する。ファイル名が全く指定されなかった場合は標準入力を処理する。
コマンドの文法
これは sed コマンドのごく簡単な文法で、既に sed を知っている人に対する備忘録程度のものである。完全な記述を求める場合は他の文書 (texinfo 文書など) にあたること。
アドレスを取らないコマンド
: label
b コマンドと t コマンド用のラベル。
#comment
次の改行文字まで (あるいは -e スクリプトフラグメントの末尾まで) をコメントとして取り扱う。
} { } ブロックの閉じ括弧。
アドレスを 0 または 1 個とるコマンド
= 現在の行番号を表示する。
a \
text text を追加する。 text に改行を含めたい場合は、その前にバックスラッシュを置く。
i \
text text を挿入する。 text に改行を含めたい場合は、その前にバックスラッシュを置く。
q これ以上入力の処理を行わず、ただちに sed スクリプトの処理を終了する。ただし auto-print が diable されていなければ、カレントのパターンスペースが出力される。
r filename
テキストを filename から読んで追加する。
アドレス範囲をとりうるコマンド
{ コマンドブロックの開始 (} で終了する)。
b label
label に分岐する。 label が省略された場合は、スクリプトの末尾に分岐する。
t label
最後に入力行が読まれ、最後に t コマンドが行われて以降に s/// が成功していれば、 label に分岐する。 label が省略された場合は、スクリプトの末尾に分 岐する。
c \
text 選択した行を text で置換する。 text に改行を含めたい場合は、その前にバックスラッシュを置く。
d パターンスペースを削除する。次のサイクルを開始する。
D パターンスペースの最初の改行までを削除する。次のサイクルを開始するが、パターンスペースにまだデータが残っていたら、入力からの読み込みをスキップする。
h H パターンスペースをホールドスペースにコピー/追加する。
g G ホールドスペースをパターンスペースにコピー/追加する。
x ホールドスペースとパターンスペースの内容を交換する。
l 現在の行を「視覚的に紛れのない」形式でリストする。
n N 入力の次の行をパターンスペースに読み込む/追加する。
p 現在のパターンスペースを出力する。
P 現在のパターンスペースの最初の改行までを出力する。
s/regexp/replacement/
パターンスペースに対して regexp のマッチを試みる。マッチに成功すると、マッチした部分を replacement に置換する。 replacement は特殊文字である & を 含む こ とができ、これはパターンスペースのマッチした部分を参照する。また \1 から \9 までの特殊エスケープを含むこともでき、これは regexp の副表現 (sub- expression) にマッチした部分をそれぞれ参照する。
w filename
現在のパターンスペースを filename に書く。
y/source/dest/
パターンスペースにある文字のうち、 source にあるものを、 dest の同じ位置にある文字に交換する。
アドレス
sed のコマンドはアドレスを指定せずに与えることもでき、この場合そのコマンドはすべての入力行に対して実行される。アドレスをひとつ与えると、コマンドはそのア ドレスにマッチした入力行に対してのみ実行される。 2 つのアドレスを与えると、最初のアドレスにマッチした行から、 2 番目のアドレスにマッチした行に至る範囲 (両マ ッチ行を含む) にあるすべての行に対して実行される。アドレスの範囲指定については 3 つのことを注意しておく。まず指定方法は addr1,addr2 である (つまりアドレ スを コ ン マ で区切る)。 addr1 にマッチした行は、たとえ addr2 がより前の行にマッチした場合でも、常に処理対象となる。 addr2 が regexp (正規表現) の場合には、addr1 にマッチした行に対しては addr2 のマッチは行われない。
アドレス (あるいはアドレス範囲) とコマンドの間には ! を挟むことができる。この場合は、アドレス (あるいはアドレス範囲) がマッチしなかった行に対してのみコ マンドが実行される。
以下のアドレスタイプがサポートされている。
number number で指定した行だけにマッチする。
first~step
first 行からはじまる step 行おきの行にマッチする。例えば ‘‘sed -n 1~2p’’ は入力行のうち奇数行を表示し、アドレスを 2~5 にすると、第 2 行から 5 行おきに表示する (これは GNU の拡張である)。
$ 最終行にマッチする。
/regexp/
正規表現 regexp にマッチした行にマッチする。
\cregexpc
正規表現 regexp にマッチした行にマッチする。文字 c は何でもよい。
正規表現
POSIX.2 BRE をサポートすべきであるが、まだ完全にはサポートできていない。正規表現内部の \n シーケンスは改行文字にマッチする。 GNU拡張も存在する。 [要修 正: より詳細を記述する必要がある。少なくとも、何がサポートされているかを述べた、他の文書へのリファレンスが必要である]
その他の注意
このバージョンのsed は、あらゆる正規表現の内部・置換コマンドの replacement の内部・文字交換 (y) コマンドの source および dest の内部のいずれにおいても、 \<newline> というシーケンスが使える。