satoshiabe.jp : SED notes
HOME > DOCUMENTS > SED > SED notes
まえがき
ここは、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)