戻る

sed解説

Apr 2, 2020

sedは置換コマンドでテキスト操作において最も基本的だが, MacなどのFreeBSD系とLinuxではその挙動が異なる部分がある. ここではLinux向けに解説する.

ファイルの内容を置換

単一ファイルの内容を変更するときはエディタで行うのが大体速いが, 複数ファイルで同じような処理をするときにはコマンドを使って一括処理する方がいい. 次の例を見てみよう.


hoge.html
<img src="img/public/1.png">
<img src="img/public/2.png">

この例のディレクトリ構造を変更する


sed -i 's/img\/public/upload/g' hoge.html

次になる


<img src="upload/1.png">
<img src="upload/2.png">

ちなみにFreeBSD系では次のコマンドになる


sed -i '' 's/img\/public/upload/g' hoge.html

このようにオプションに-iをつけることでファイルの内容を直接変更する. 通常は危険なのでバックアップファイルを生成するオプションもつける.


sed -i.bk 's/imb\/public/upload/g' hoge.html

vimの置換コマンドを使ったことがあればすぐわかる. 末尾のgは一行に複数箇所マッチする文字列がある場合に全部置換してくれる. デフォルトでは一行につき一つまでしか置換してくれない. この仕様は何のためなのかよくわからない.

複数ファイルの置換をやってみよう. forループの説明をする. 次の例ではiを変数として参照する. ;はコマンドの終わりで区切るために用いられる. forコマンド, doコマンド, doneコマンドと覚えるしかない. doneはここでは末尾のコマンドなので;はいらない. このコマンドによりカレントディレクトリのファイルが表示される. ``はバッククオートでコマンドの実行結果をforの引数として渡すことができる.


for i in `ls -a`; do echo $i ;done 
#出力結果
.
..
hoge.html
aaa.html
hoge2.html

実際に操作したいファイルは一部なので, 次のようにfindを使って絞り込む.


for i in `ls -a | find hoge*`; do echo $i;done

sedと組み合わせる


for i in `la -a | find hoge*`; do sed -i 's/img\/public/upload/g' $i;done