導入
grep が「探す」道具なら、sed(stream editor)は「書き換える」道具です。ファイルを開いて手で直すのではなく、流れてくる各行を自動で変換 します。設定ファイルの一括置換やログの整形など、現場の定番中の定番です。
説明
sed は入力を1行ずつ受け取り、指定した編集を施して 出力します。いちばん使うのが置換 s/古い/新しい/ です。
flowchart LR
IN["入力の各行"] --> SED["sed 's/古い/新しい/'"] --> OUT["置換された各行"]
data.csv の「東京」を「TOKYO」に置き換えてみましょう。末尾の g(global)は「行内のすべて」を意味します(付けないと各行の最初の1個だけ)。
sed 's/東京/TOKYO/g' data.csv
元のファイルは変わりません。sed は 画面に結果を出すだけ なのが安全なところです(保存したいときは > で別ファイルへ)。
行を 消す には d(delete)を使います。アドレス(対象の指定)と組み合わせるのが強力で、/ERROR/d は「ERROR を含む行を消す」です。
sed '/ERROR/d' logs/app.log
特定の行だけを 抜き出す なら、-n(自動表示をやめる)と p(print)を組みます。2p は「2行目だけ」。
sed -n '2p' data.csv
もちろんパイプの途中にも置けます。grep で絞ってから sed で整える、が黄金パターンです。
cat data.csv | sed 's/,/ | /g'
やってみよう
sed 's/東京/TOKYO/g' data.csv で東京がすべて置き換わること、そして元の data.csv は cat data.csv で見ると無傷なことを確かめましょう。sed '/ERROR/d' logs/app.log でエラー行だけ消える、sed -n '2p' data.csv で2行目だけ出る、も試してください。
演習
data.csv の中の「大阪」をすべて「OSAKA」に置き換えて表示してください。
ヒント1を見る
置換は s/古い/新しい/、すべて置き換えるには末尾に g です。
ヒント2を見る
sed 's/大阪/OSAKA/g' data.csv