sed - ストリームエディタ

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

sedの使い方

-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
$

入力されたテキストのうち2行目を削除するには、 address に 2、 command に d を指定します。

$ sed '2 d' member
umeda erika
nakajima saki

入力されたテキストのうち1行目から2行目までの行を削除するには、 address に 1,2、 command に d を指定します。

$ sed '1,2 d' member
nakajima saki

入力されたテキストのうち最後の行を削除するには、 address に $、 command に d を指定します。

$ sed '$ d' member
umeda erika
yajima maimi

特定の文字列を含む行だけ出力するには、複数のやり方がある。

  1. デフォルトの出力を抑制して、正規表現にマッチした行だけを出力する。
  2. 正規表現にマッチしなかった行を削除する。

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

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

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

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

address を省略した場合、すべての入力行に対してコマンドが実行されます。すべての入力行に対して、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

現在の行番号を表示するには、 command に「 = 」を指定する。

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

テキストを追加するには、 command に「 a 」を指定する。

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

テキストを挿入するには、 command に「 i 」を指定する。

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

選択した行を置換するには、 command に「 c 」を指定する。

$ sed 'c changed' member
changed
changed
changed

アドレスに正規表現を指定することもできる。以下の例では、ヒアドキュメント(末尾が「 << 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の使用例

指定した文字列を含まない行を出力する

指定した文字列を含まない行を出力するには、正規表現にマッチした行を削除する。

sed '/string/ d' filename