おれさまラボ

実際に手を動かして理解を深めるブログ。

sedコマンドの使い方

シェルスクリプトを書いてみる。

sedコマンドとは

sed(セド、セッド)コマンドは、文字列の置換や削除などのテキスト処理を行うコマンド。Stream Editor の略。

その名の通り実はエディタで、非対話型エディタに分類されます。

指定されたファイルを読み込み、sedコマンドが置換や削除などのフィルタ処理を行い、その結果を標準出力する流れになります。

標準出力を行うため、元のファイルは変更しません。

 

基本的な使い方

$ 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>に報告してください。