sed

ストリームエディタ

sed - ストリームエディタ
sed [-n] [-V] [--quiet] [--silent] [--version] [--help]
[-e script] [--expression=script]
[-f script-file] [--file=script-file]
[script-if-no-other-script]
[file...]
\*(sd はストリームエディタである。 ストリームエディタは、入力ストリーム (ファイルまたはパイプラインからの入力) に対して基本的なテキスト変換を行うために用いられる。 \*(sd は 編集スクリプトを使える (ed のような) エディタと いろいろな面で似ているが、 \*(sd は入力に対して 1 パスだけで動作するので、より効率的である。 また \*(sd はパイプラインのテキストに対してフィルタ動作を行うことができ、 この点は他のタイプのエディタとはっきり違う。
\*(sd の起動時には以下のコマンドラインオプションを指定できる。
-V

--version
sed のバージョン・著作権表示を出力し、終了する。
-h

--help
コマンドラインオプションを簡単にまとめた利用法と バグレポート先のアドレスを出力し、終了する。
-n

--quiet

--silent
デフォルトでは、 \*(sd はスクリプトの各サイクルの最後でパターンスペースの内容を出力する。 これらのオプションを指定するとこの自動的な出力が行われなくなり、 p コマンドで出力することを指定された場合に限って \*(sd は出力を生成する。
-e script

--expression= script
script のコマンドを、入力の処理中に行われるコマンドセットに追加する。
-f script-file

--file= script-file
ファイル script-file に含まれるコマンドを、入力の処理中に行われるコマンドセットに追加する。 -e , -f , --expression , --file などのオプションがコマンドラインから全く与えられなかった場合は、 コマンドラインの引き数のうち、オプションでない最初のものが script として受け取られ、実行される。 以上のコマンドラインパラメータを処理したあとに引き数が残った場合は、 それらは処理対象となる入力ファイルのファイル名と解釈される。 - というファイル名は、標準入力ストリームを参照する。 ファイル名が全く指定されなかった場合は標準入力を処理する。
これは \*(sd コマンドのごく簡単な文法で、 既に sed を知っている人に対する備忘録程度のものである。 完全な記述を求める場合は他の文書 (texinfo 文書など) にあたること。

アドレスを取らないコマンド

: label
b コマンドと t コマンド用のラベル。
# comment
次の改行文字まで (あるいは -e スクリプトフラグメントの末尾まで) をコメントとして取り扱う。
}
{ } ブロックの閉じ括弧。

アドレスを 0 または 1 個とるコマンド

=
現在の行番号を表示する。
a \

text
text を追加する。 text に改行を含めたい場合は、その前にバックスラッシュを置く。
i \

text
text を挿入する。 text に改行を含めたい場合は、その前にバックスラッシュを置く。
q
これ以上入力の処理を行わず、ただちに \*(sd スクリプトの処理を終了する。 ただし 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 の同じ位置にある文字に交換する。
\*(sd のコマンドはアドレスを指定せずに与えることもでき、 この場合そのコマンドはすべての入力行に対して実行される。 アドレスをひとつ与えると、 コマンドはそのアドレスにマッチした入力行に対してのみ実行される。 2 つのアドレスを与えると、最初のアドレスにマッチした行から、 2 番目のアドレスにマッチした行に至る範囲 (両マッチ行を含む) にあるすべての行に対して実行される。 アドレスの範囲指定については 3 つのことを注意しておく。 まず指定方法は addr1 , addr2 である (つまりアドレスをコンマで区切る)。 addr1 にマッチした行は、たとえ addr2 がより前の行にマッチした場合でも、常に処理対象となる。 addr2regexp (正規表現) の場合には、 addr1 にマッチした行に対しては addr2 のマッチは行われない。 アドレス (あるいはアドレス範囲) とコマンドの間には ! を挟むことができる。この場合は、アドレス (あるいはアドレス範囲) が マッチしなかった行に対してのみコマンドが実行される。 以下のアドレスタイプがサポートされている。
number
number で指定した行だけにマッチする。
first ~ step
first 行からはじまる step 行おきの行にマッチする。例えば ``sed -n 1~2p'' は 入力行のうち奇数行を表示し、アドレスを 2~5 にすると、 第 2 行から 5 行おきに表示する (これは GNU の拡張である)。
$
最終行にマッチする。
/ regexp /
正規表現 regexp にマッチした行にマッチする。
\c regexp c
正規表現 regexp にマッチした行にマッチする。 文字 c は何でもよい。
POSIX.2 BRE をサポートすべきであるが、まだ完全にはサポートできていない。 正規表現内部の \n シーケンスは改行文字にマッチする。 GNU 拡張も存在する。 [要修正: より詳細を記述する必要がある。 少なくとも、何がサポートされているかを述べた、 他の文書へのリファレンスが必要である]
このバージョンの sed は、 あらゆる正規表現の内部・置換コマンドの replacement の内部・文字交換 (y) コマンドの source および dest の内部のいずれにおいても、 <newline> というシーケンスが使える。
awk (1), ed (1), expr (1), emacs (1), perl (1), tr (1), vi (1), regex (5) [うーん、書かないとダメですねえ] 【訳注: LDP には regex (7) があります】, sed.info, \*(sd に関する様々な本のいずれか, the \*(sd FAQ (http://www.wollery.demon.co.uk/sedtut10.txt, http://www.ptug.org/sed/sedfaq.htm).
バグレポートは bug-gnu-utils@gnu.org まで送って下さい。 「Subject:」フィールドのどこかに 「sed」という単語を入れるようにして欲しい。