satoshiabe.jp : SED notes

HOME > DOCUMENTS > SED > SED notes

SED notes

Updated : 2006/05/31
Created : 2006/01/27

まえがき

sed とは

sed の実行

meta characters

sed の構文

置換コマンド : s

削除コマンド : d

追加コマンド : a

挿入コマンド : i

サンプル : HTML ファイルのタグを処理する

リンク

まえがき

ここは、sed に関する自分用の備忘録ページ。 徐々に内容を追加していく予定。

sed とは

sed はストリームエディタであり、入力ストリームにテキスト処理を実行する。 ちなみに通常、sed は処理結果を標準出力へ書き出すだけで元の内容を変更しない。 変更した結果をファイルに保存したい場合、リダイレクトを使用するなどすること。

sed の実行

sed の実行例をいくつか紹介する。 単純な置換を例とする。

コマンドラインから実行する場合。

% sed 's/root/ROOT/g' /etc/passwd

-e オプションに続く引数は sed の命令であると解釈される。 単一の命令の場合、省略できる。

% sed -e 's/root/ROOT/g' -e 's/hoge/HOGE/g' /etc/passwd

ファイルから実行する場合。 -f オプションは、sed に与える命令が記述されているファイルを指定する。 スクリプトが複雑で大きな内容であれば、命令を別のファイルとして作成したほうが良いかもしれない。

% sed -f cmdfile /etc/passwd

-n オプションを指定すると、入力行の自動出力が無効になる。 p フラグ (後述) を指定すると、処理された行だけが表示される。

% sed -n 's/^root/ROOT/' /etc/passwd %

meta characters

sed で使用できるメタキャラクタ。 正規表現を使用できる他のコマンド grep や AWK や Perl などと比較して制限がある。

. 改行を除く 1 文字にマッチする。 * 直前の文字の 0 回以上にマッチする。 [...] bracket に囲まれたうちの 1 文字にマッチする。 ^ 行頭にマッチする。 $ 行末にマッチする。 \{n,m\} \{n\} 直前の文字が n 回くりかえすときにマッチする。 \{n,\} 直前の文字が n 回以上くりかえすときにマッチする。 \{n,m\} 直前の文字が n 回から m 回までの任意の回数くりかえすときにマッチする。 \ 続く文字の特別な意味をなくす。

sed の構文

sed の基本的な構文は以下のとおり。

[address] には、正規表現、行番号、行アドレス記号を指定できる。

[address]command

[line-address] には、行アドレスを指定できる。

[line-address]command

ブレースを使用するとコマンドをグルーピングできる。

adress{ command1 command2 command3 }

置換コマンド : s

置換の構文

置換の構文は以下のとおり。

[address]s/pattern/replacement/flags

尚、address と pattern が同一の場合、以下のように省略できる。

[address]s//replacement/flags

サンプル

置換のサンプル。

% sed -n -e '/^root/s//ROOT/p' /etc/passwd ROOT:x:0:0:root:/root:/bin/bash %

以下フラグを flags に指定できる。

g
入力した行に対してグローバルに置換する。 この g フラグを指定しない場合、最初に発見された文字 (or 文字列) しか置換されない。

n
???

p
パターンスペースの内容を表示する

w file
file に書き出す

&

replacement で unescaped な & を記述すると、pattern でマッチした内容でリプレースできる。 わかいやすい例ではないがサンプルをひとつ。 pattern に複数のパタンが想定される場合に役立つだろう。 echo コマンドに -e オプションを指定すると、バックスラッシュでエスケープした文字を解釈するようになる。

% echo -e "03-0000-0000\n03-1111-1111\n03-2222-2222" \ | sed -e 's/^03-[0-9]\{4\}-[0-9]\{4\}$/HOGE & FUGA/' HOGE 03-0000-0000 FUGA HOGE 03-1111-1111 FUGA HOGE 03-2222-2222 FUGA %

\(...\)

エスケープ付きのかっこを使用すると、最大 9 個まで任意の部分を記憶しておいて後で再利用できる。 replacement の部分でバックスラッシュに数字を指定する。

% echo "aaabbbcccddd" | sed -e 's/\([a][a]*\)\([b][b]*\)\([c][c]*\)\([d][d]*\)/\4\3\2\1/' dddcccbbbaaa

削除コマンド : d

削除コマンドの構文は以下のとおり。

[address]d

削除コマンドを使用したサンプル。 文字クラス内では、スペースとタブが指定されているため、空行に見えても実はスペースやタブが入力されているという行にもヒットする。

% cat list aaa bbb ccc ddd eee % % sed -e '/^[ ]*$/d' list aaa bbb ccc ddd eee % cat list | sed -e '4,${\ /^$/d\ }' aaa bbb ccc ddd eee %

追加コマンド : a

追加コマンドの構文は以下のとおり。 line-address にマッチすると、その直後の行に指定した text を追加する。 \ を指定すると、複数行の text を指定できる。

[line-address]a\ text\ text\ text

% cat list aaa bbb ccc ddd eee % % sed '/^bbb/a\ ' list aaa bbb ccc ddd eee % % sed '/^bbb/a\ \ ' list aaa bbb ccc ddd eee % % sed '/^bbb/a\ ZZZZZ' list aaa bbb ZZZZZ ccc ddd eee %

挿入コマンド : i

挿入コマンドの構文は以下のとおり。 line-address にマッチすると、その直前の行に指定した text を追加する。 \ を指定すると、複数行の text を指定できる。

[line-address]i\ text\ text\ text

% cat list aaa bbb ccc ddd eee % % sed -e '/^bbb/i\ ' list aaa bbb ccc ddd eee % % sed -e '/^bbb/i\ ZZZZZ' list aaa ZZZZZ bbb ccc ddd eee %

サンプル : HTML ファイルのタグを処理する

HTML ファイルを処理する簡単なスクリプト。 デリミタを ! で指定している。

/<body>/,/<\/body>/{ s!<B>!<b>!g s!</B>!</b>!g s!<BR>!<br>!g s!<FONT>!</font>!g s!</FONT>!</font>!g }

リンク

sed - GNU Project - Free Software Foundation (FSF) (gnu.org)

Manpage of SED (linux.or.jp)

Manpage of STDIO (linux.or.jp)

Email to Satoshi ABE