sed — ストリームエディタ

sed(stream editor)は読み込んだテキストをスクリプトに従って編集し、標準出力に書き出すコマンドです。

目次

  1. 使い方
  2. オプション
  3. スクリプト
  4. アドレス
    1. $
    2. 正規表現
  5. コマンド
    1. =
    2. p
    3. a text
    4. i text
    5. c text
    6. d
    7. s/regexp/replacement/

使い方

-eまたは--expressionオプションに指定したスクリプトを実行する。

sed [options] -e script [input_file ...]
sed [options] --expression=script [input_file ...]

-fまたは--fileオプションに指定したスクリプトファイルを実行する。

sed [options] -f script_file [input_file ...]
sed [options] --file=script_file [input_file ...]

-e--expression-fまたは--fileオプションのいずれも指定しない場合は、コマンドオプションではない最初の引数がsedスクリプトとして実行される。

sed [options] script [input_file ...]

input-file には入力するファイル名を指定します。省略した場合は標準入力から読み込みます。

編集コマンドは script に直接指定するか、編集コマンドを格納したファイル名を script-file に指定します。

オプション

以下に示すオプションを sed コマンドに指定できる。

-n
パターンスペースの内容を出力しない。

memberという名前のファイルがあり、次のようなテキストが格納されているとする。

$ more member
umeda erika
yajima maimi
nakajima saki
$

sedの基本動作は、入力されたテキストをそのまま標準出力へ書き出すことである。空のスクリプトを指定した例を次に示す。

$ sed '' member
umeda erika
yajima maimi
nakajima saki
$

sedコマンドの引数に -n オプションを指定すると、基本動作が何も出力しないようになる。この場合、コマンドで処理しない限り何も標準出力に書き出されなくなる。

$ sed -n '' member
$
--quiet
--silent
GNU 形式のオプションであり、POSIX 形式の -n オプションと機能は同じである。
-e script
scriptに指定したスクリプトを実行する。
--expression=script
GNU 形式のオプションであり、POSIX 形式の -e オプションと機能は同じである。
-f file
ファイル script-file に含まれるコマンドを、入力の処理中に行われるコマンドセットに追加する。
--file=file
GNU 形式のオプションであり、POSIX 形式の -f オプションと機能は同じである。
-i [suffix]
編集結果を標準出力に出力するのではなく、入力ファイルを編集する。ファイル拡張子 suffix が指定された場合、編集前のファイルのバックアップを作成する。
--in-place[=suffix]
GNU 形式のオプションであり、POSIX 形式の -i オプションと機能は同じである。

スクリプト

sedのスクリプトは次のような書式で記述します。

[address1[,address2]] [!]command [arguments]

address1 及び address2 には次表に示す形式でアドレスを指定する。

sedのアドレス
アドレス 説明
number number (1~)行目にマッチする。
$ 最終行にマッチする。
/ regexp / 正規表現 regexp にマッチした行にマッチする。

address1 のみ指定した場合、 address1 で指定したアドレスにマッチした入力行に対してのみコマンドが実行される。

address1 及び address2 を指定した場合、 address1 から address2 までの入力行に対してコマンドが実行される。

address1 及び address2 の指定を省略した場合、すべての入力行に対して command で指定したコマンドが実行される。

! を指定した場合、アドレスまたはアドレス範囲にマッチしなかった入力行に対してコマンドが実行される。

command にはsedのコマンド、 arguments にはコマンドの引数を指定する。アドレスとコマンドの間にはスペースを空けなくてもよい。たとえば、 "1,2 d" は "1,2d" と記述できる。

sedのコマンド
コマンド 説明
= 現在の行番号を表示する。
a text text を追加する。
c text 選択した行を text で指定した文字列に置換する。
d パターンスペースを削除する。
i text text を挿入する。
p 現在のパターンスペースを出力する。
q sedスクリプトの処理を終了する。
s/ regexp / replacement / パターンスペースが regexp に指定した正規表現にマッチすれば、 replacement に指定した文字列に置き換える。

memberという名前のファイルがあり、次のようなテキストが格納されているとします。

umeda erika
yajima maimi
nakajima saki

sedの基本動作は、入力されたテキストをそのまま標準出力へ書き出すことです。空のスクリプトを指定した例を次に示します。

$ sed '' member
umeda erika
yajima maimi
nakajima saki

sedコマンドの引数に -n オプションを指定すると、基本動作が何も出力しないようになります。この場合、コマンドで処理しない限り何も標準出力に書き出されなくなります。

$ sed -n '' member
$
$ sed '1,2 d' member
nakajima saki

アドレス

$

最後の行の後にテキストを追加する。

$ sed '' member
umeda erika
yajima maimi
nakajima saki
$ sed '$ a added' member
umeda erika
yajima maimi
nakajima saki
added

最後の行の前にテキストを挿入する。

$ sed '' member
umeda erika
yajima maimi
nakajima saki
$ sed '$ i inserted' member
umeda erika
yajima maimi
inserted
nakajima saki

最後の行を削除する。

$ sed '' member
umeda erika
yajima maimi
nakajima saki
$ sed '$ d' member
umeda erika
yajima maimi

正規表現

アドレスに正規表現を指定することができる。以下の例では、ヒアドキュメント(末尾が「 << EOF」で終わる行から「 EOF 」という行まで)を抽出して出力している。

$ cat foo.sh
#!/bin/sh
echo sed example script
ftp << EOF
open myhost
user marina horiuchi
get remotefile
bye
EOF
$ sed -n '/<< EOF$/,/^EOF$/ p' foo.sh
ftp << EOF
open myhost
user marina horiuchi
get remotefile
bye
EOF

コマンド

=

アドレスまたはアドレス範囲にマッチした行の行番号を表示する。

$ sed '' member
umeda erika
yajima maimi
nakajima saki
$ sed '=' member
1
umeda erika
2
yajima maimi
3
nakajima saki

p

デフォルトの出力を抑制して、正規表現にマッチした行だけを出力する例を示す。

$ sed -n '/ma/ p' member
yajima maimi
nakajima saki

a text

すべての行の後にテキストを追加する。

$ sed '' member
umeda erika
yajima maimi
nakajima saki
$ sed 'a added' member
umeda erika
added
yajima maimi
added
nakajima saki
added

最後の行の後にテキストを追加する。

$ sed '' member
umeda erika
yajima maimi
nakajima saki
$ sed '$ a added' member
umeda erika
yajima maimi
nakajima saki
added

i text

すべての行の前にテキストを挿入する。

$ sed '' member
umeda erika
yajima maimi
nakajima saki
$ sed 'i inserted' member
inserted
umeda erika
inserted
yajima maimi
inserted
nakajima saki

最後の行の前にテキストを挿入する。

$ sed '' member
umeda erika
yajima maimi
nakajima saki
$ sed '$ i inserted' member
umeda erika
yajima maimi
inserted
nakajima saki

c text

すべての行を別のテキストに置き換える。

$ sed '' member
umeda erika
yajima maimi
nakajima saki
$ sed 'c changed' member
changed
changed
changed

2行目を別のテキストに置き換える。

$ sed '' member
umeda erika
yajima maimi
nakajima saki
$ sed '2 c changed' member
umeda erika
changed
nakajima saki

1行目から2行目までを別のテキストに置き換える。

$ sed '' member
umeda erika
yajima maimi
nakajima saki
$ sed '1,2 c changed' member
changed
nakajima saki

正規表現にマッチした行を別のテキストに置き換える。

$ sed '' member
umeda erika
yajima maimi
nakajima saki
$ sed '/ma/ c changed' member
umeda erika
changed
changed

正規表現にマッチしなかった行を別のテキストに置き換える。

$ sed '' member
umeda erika
yajima maimi
nakajima saki
$ sed '/ma/ !c changed' member
changed
yajima maimi
nakajima saki

d

すべての行を削除する。

$ sed '' member
umeda erika
yajima maimi
nakajima saki
$ sed 'd' member
$

2行目を削除する。

$ sed '' member
umeda erika
yajima maimi
nakajima saki
$ sed '2 d' member
umeda erika
nakajima saki

2行目以外を削除する。

$ sed '' member
umeda erika
yajima maimi
nakajima saki
$ sed '2 !d' member
yajima maimi

最後の行を削除する。

$ sed '' member
umeda erika
yajima maimi
nakajima saki
$ sed '$ d' member
umeda erika
yajima maimi

1行目から2行目までを削除する。

$ sed '' member
umeda erika
yajima maimi
nakajima saki
$ sed '1,2 d' member
nakajima saki

1行目から2行目まで以外を削除する。

$ sed '' member
umeda erika
yajima maimi
nakajima saki
$ sed '1,2 !d' member
umeda erika
yajima maimi

正規表現にマッチした行を削除する。

$ sed '' member
umeda erika
yajima maimi
nakajima saki
$ sed '/ma/ d' member
umeda erika

正規表現にマッチしなかった行を削除する。

$ sed '' member
umeda erika
yajima maimi
nakajima saki
$ sed '/ma/ !d' member
yajima maimi
nakajima saki

s/regexp/replacement/

すべての入力行に対して、maという文字列をMAに変換する場合、次のように指定します。

$ sed 's/ma/MA/' member
umeda erika
yajiMA maimi
nakajiMA saki

変換が行われるのは、1行の入力につき最初の1箇所だけです。すべて変換するには次のようにします。

$ sed 's/ma/MA/g' member
umeda erika
yajiMA MAimi
nakajiMA saki

maという文字列をMAに変換した行だけを出力するには次のようにします。

$ sed -n 's/ma/MA/p' member
yajiMA maimi
nakajiMA saki

maという文字列を削除する場合、次のように指定します。

$ sed 's/ma//' member
umeda erika
yaji maimi
nakaji saki

関連記事