26.3.1 sed とは?

hwb26.2 grep で説明した grep コマンドはテキストファイルを 1 行ずつ読み込み,指定した検索パターンにマッチした行だけを表示します.これから説明する sed コマンドはもっと高機能で,正規表現を使って文字列を検索するだけでなく,マッチした文字列を別の文字列に置き換えるなど色々なことができます.ちなみに sed は “Stream EDitor” の略で,1 行ずつ処理するという動作が名前の由来になっています.

さっそく例を見てみましょう.hwb26.2.1 grep とは? で用いたファイル nobelprize.txt を使います.このファイルは年号が 4 桁の西暦で表示されています.西暦の最初の 2 桁を省略してアポストロフィにするには,ターミナルで次のように入力します.

sed "s/[0-9][0-9]/'/" nobelprize.txtreturn2
'11 Saul Perlmutter, Brian P. Schmidt, Adam G. Riess '10 Andre Geim, Konstantin Novoselov '09 Charles Kuen Kao, Willard S. Boyle, George E. Smith '08 Yoichiro Nambu, Makoto Kobayashi, Toshihide Maskawa '07 Albert Fert, Peter Grünberg ...

sed に与えた “s/[0-9][0-9]/’/” の部分をスクリプトと言います.最初の s は「文字列の置換」を意味します.この s の後ろにスラッシュ / で区切って [0-9][0-9] と ‘ を並べることで [0-9][0-9] にマッチした部分を ‘ で置き換えるという意味になります.[0-9][0-9] は正規表現で任意の 2 桁の数字を意味しますから,これで西暦 4 桁の最初の 2 桁にマッチするわけです.なお置換をした結果は画面に表示されるので,元のファイル nobelprize.txt は一切変更されません.

[0-9][0-9] が最初の 2 桁だけにマッチして後ろの 2 桁にマッチしないのはちょっと不思議ですが,sed では「指定したパターンが最初に出てきた場所だけを置換する」という仕様になっています.最初に出た場所だけでなく 1 行全体にわたって置換する場合,検索パターンの後ろに g というオプションをつけます.たとえば上の例を書き換えて “s/[0-9][0-9]/’/g” にすると,4 桁の数字が全て 2 個のアポストロフィになってしまいます.

sed "s/[0-9][0-9]/'/g" nobelprize.txtreturn2
'' Saul Perlmutter, Brian P. Schmidt, Adam G. Riess '' Andre Geim, Konstantin Novoselov ...

こうしてひとまず文字列の置換ができました.しかし sed には文字列の置換だけでなく,他にも様々な命令が用意されています.加えてそれらの命令を組み合わせた sed スクリプトを書けば,複雑な操作をあっという間に実現することもできます.次節以下でより詳しい使い方を見ていきましょう.