sed(stream editor)は読み込んだテキストをスクリプトに従って編集し、標準出力に書き出すコマンドです。
=
p
a text
i text
c text
d
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 コマンドに指定できる。
memberという名前のファイルがあり、次のようなテキストが格納されているとする。
$ more member
umeda erika
yajima maimi
nakajima saki
$
sedの基本動作は、入力されたテキストをそのまま標準出力へ書き出すことである。空のスクリプトを指定した例を次に示す。
$ sed '' member
umeda erika
yajima maimi
nakajima saki
$
sedコマンドの引数に -n オプションを指定すると、基本動作が何も出力しないようになる。この場合、コマンドで処理しない限り何も標準出力に書き出されなくなる。
$ sed -n '' member
$
sedのスクリプトは次のような書式で記述します。
[address1[,address2]] [!]command [arguments]
address1 及び address2 には次表に示す形式でアドレスを指定する。
アドレス | 説明 |
---|---|
number | number (1~)行目にマッチする。 |
$ | 最終行にマッチする。 |
/ regexp / | 正規表現 regexp にマッチした行にマッチする。 |
address1 のみ指定した場合、 address1 で指定したアドレスにマッチした入力行に対してのみコマンドが実行される。
address1 及び address2 を指定した場合、 address1 から address2 までの入力行に対してコマンドが実行される。
address1 及び address2 の指定を省略した場合、すべての入力行に対して command で指定したコマンドが実行される。
! を指定した場合、アドレスまたはアドレス範囲にマッチしなかった入力行に対してコマンドが実行される。
command にはsedのコマンド、 arguments にはコマンドの引数を指定する。アドレスとコマンドの間にはスペースを空けなくてもよい。たとえば、 "1,2 d" は "1,2d" と記述できる。
コマンド | 説明 |
---|---|
= | 現在の行番号を表示する。 |
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