シェルスクリプトを書いてみる。
sedコマンドとは
sed(セド、セッド)コマンドは、文字列の置換や削除などのテキスト処理を行うコマンド。Stream Editor の略。
その名の通り実はエディタで、非対話型エディタに分類されます。
指定されたファイルを読み込み、sedコマンドが置換や削除などのフィルタ処理を行い、その結果を標準出力する流れになります。
標準出力を行うため、元のファイルは変更しません。
基本的な使い方
スクリプトはシングルクォーテーションマーク('スクリプト')で囲ってあげましょう。囲わないと以下のようなエラーを履く場合があります。
$ cat basho.txt | sed 2,$d
sed: -e expression #1, char 2: 予期しない `,' です
dコマンドで行を削除する
dコマンドは行を削除するスクリプトです。
下の例ではbasho.txtの2行目を削除して出力しています。
'2d'はスクリプトを意味します。正確には、'2'はアドレス(2行目)、'd'はコマンド(削除)を表しています。
$ cat -n basho.txt
1 古池や
2 蛙飛び込む
3 水の音$ sed '2d' basho.txt
古池や
水の音
また、sedコマンドは、パイプで渡すことが出来ます。
$ cat -n basho.txt | sed '2d'
1 古池や
3 水の音
1~2行目を削除するにはカンマで区切ります。
$ cat -n basho.txt | sed '1,2d'
3 水の音
'$'は最終行を意味します。'2,$d'と指定すれば、2行目から最終行までを削除するという意味になります。
$ cat -n basho.txt | sed '2,$d'
1 古池や
pコマンドで行を表示する
pコマンドは行を表示するスクリプトです。
ただし、単にpコマンドをつけて実行すると、1行目が2回表示されてしまいます。
$ cat -n basho.txt | sed '1p'
1 古池や
1 古池や
2 蛙飛び込む
3 水の音
これは、sedコマンドの仕組み上仕方のないことなので、あまり気にする必要はありません。sedコマンドは、パターン空間と呼ばれる場所に一度内容をコピーしてからマッチするアドレス(1)に対してコマンド(p)を実行し、その後パターン空間の内容をすべて出力します。だから、上記の例では1行目が2回あるように見えてしまうのです。
dコマンドで同じ現象が起きなかったのは、dコマンドが削除するコマンドなので、最後にパターン空間をすべて削除した形になるからです。たぶん。
1行目が2回表示される結果を回避するには-nオプションを付けます。
-nオプションはパターン空間の出力を抑制するオプションです。
$ cat -n basho.txt | sed -n '1p'
1 古池や
sコマンドで置換する
sは文字列を置換するコマンドです。
以下のように記述します。フラグは省略可能です。
$ sed 's/置換前文字列/置換後文字列/[フラグ]' <ファイル名>
例えば以下のように記述します。「蛙」が「?」に置換されました。
$ cat -n basho.txt | sed 's/蛙/?/'
1 古池や
2 ?飛び込む
3 水の音
sコマンドは1行目から探していき、その行で最初に見つかった該当文字列のみに置換処理を行います。そのため、下の例では2行目に「蛙」が残ってしまいます。
$ cat -n basho.txt | sed 's/蛙/?/'
1 古池や 古池や
2 ?飛び込む 蛙飛び込む
3 水の音 水の音
見つかったすべての文字列を置換するにはgフラグを付けます。
今度はきちんとすべての「蛙」が「?」に置換されています。
$ cat -n basho.txt | sed 's/蛙/?/g'
1 古池や 古池や
2 ?飛び込む ?飛び込む
3 水の音 水の音
置換後の文字列を指定しないことで、その文字列を削除することができます。
$ cat -n basho.txt | sed 's/蛙//g'
1 古池や
2 飛び込む
3 水の音
pフラグを使うことで、置換が発生した行を出力できます。
$ cat -n basho.txt | sed 's/蛙//gp'
1 古池や
2 飛び込む
2 飛び込む
3 水の音
例によってパターン空間が出力されるので、-nオプションを使うことで、置換が発生した行のみ出力します。
$ cat -n basho.txt | sed -n 's/蛙//gp'
2 飛び込む
ヘルプ
$ sed --help
使用法: sed [OPTION]... {script-only-if-no-other-script} [input-file]...
-n, --quiet, --silent
パターン空間の自動出力を抑制する
-e script, --expression=script
実行するコマンドとして script を追加する
-f script-file, --file=script-file
実行するコマンドとして script-file の中身を追加する
--follow-symlinks
処理の際にその場でシンボリックリンクを辿る
-i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if SUFFIX supplied)
-l N, --line-length=N
`l' コマンドの行折り返しの長さを指定する
--posix
全ての GNU 拡張を無効にする
-r, --regexp-extended
スクリプトで拡張正規表現を使用する
-s, --separate
複数のファイルを処理する際に連続した単一の長いストリーム
としてではなく、個別に取り扱う
-u, --unbuffered
入力ファイルからデータをごく少量ずつ取り込み、頻繁に出力
バッファに出力 (flush) する
-z, --null-data
separate lines by NUL characters
--help このヘルプを表示して終了する
--version バージョン情報を表示して終了する
-e、--expression、-f または --file オプションのいずれも与えられない場合、
最初のオプションでない引数が解釈する sed スクリプトとして扱われます。
全ての残りの引数は入力ファイル名として扱われます。入力ファイルが指定さ
れていない場合は、標準入力から読み込みます。
GNU sed ホームページ: <http://www.gnu.org/software/sed/>.
GNU ソフトウェアを使用する際の一般的なヘルプ: <http://www.gnu.org/gethelp/>.
電子メールによるバグ報告の宛先: <bug-sed@gnu.org>
報告の際、“Subject:” フィールドのどこかに “sed” を入れてください。
翻訳に関するバグは<translation-team-ja@lists.sourceforge.net>に報告してください。