sed(stream editor)は読み込んだテキストをスクリプトに従って編集し、標準出力に書き出すコマンドです。
-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
$
入力されたテキストのうち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
特定の文字列を含む行だけ出力するには、複数のやり方がある。
デフォルトの出力を抑制して、正規表現にマッチした行だけを出力する例を示す。
$ 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 '/string/ d' filename