sed - ストリームエディタ
sed [-n] [-V] [--quiet] [--silent] [--version] [--help]
[-e script] [--expression=script]
[-f script-file] [--file=script-file]
[script-if-no-other-script]
[file...]
sed
はストリームエディタである。
ストリームエディタは、入力ストリーム
(ファイルまたはパイプラインからの入力)
に対して基本的なテキスト変換を行うために用いられる。
sed は
編集スクリプトを使える
(
ed のような)
エディタと
いろいろな面で似ているが、
sed は入力に対して 1
パスだけで動作するので、より効率的である。
また
sed
はパイプラインのテキストに対してフィルタ動作を行うことができ、
この点は他のタイプのエディタとはっきり違う。
オプション¶
sed
の起動時には以下のコマンドラインオプションを指定できる。
- -V
- --version
- sed
のバージョン・著作権表示を出力し、終了する。
- -h
- --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>
というシーケンスが使える。
関連項目¶
awk(1),
ed(1),
expr(1),
emacs(1),
perl(1),
tr(1),
vi(1),
regex(5)
[うーん、書かないとダメですねえ]
【訳注: LDP には
regex(7)
があります】, sed.info,
sed
に関する様々な本のいずれか,
the
sed FAQ (
http://www.wollery.demon.co.uk/sedtut10.txt,
http://www.ptug.org/sed/sedfaq.htm).
バグレポートは
bug-gnu-utils@gnu.org
まで送って下さい。
「Subject:」フィールドのどこかに
「sed」という単語を入れるようにして欲しい。