ex(vim -e)コマンドを使おう

sedとxargsで特定文字列を一括置換する方法。

find ./ -name *.html | xargs sed -i 's/検索文字列/置換文字列/g'
sedとxargsで特定文字列を一括置換 - プログラマになりたい

んー、これだと上手く動かないよ。

find ./ -name *.html | xargs sed -i 's/検索文字列/置換文字列/g' {}

としないと

あと、sedだと標準出力に出るだけで面白くない。
どうせなら一括置換して保存したい。コメント欄参照

ed コマンド

ed コマンドというのがある。行指向のテキストエディタである。viのexコマンドの多くはedコマンドが由来していると思われる。viの操作が出来る人はedコマンドにもすぐ慣れることが出来るのではないかと思う。

んで、このedコマンドがそこら辺のエディタと違うのはバッチ処理的なことができる事。ファイルの中身を直接書き換えて保存なんて事ができる。

ed path/to/file <<EOF
%s/foo/bar/g
wq
EOF

という感じで標準入力にコマンドを渡してあげるとバッチ処理ができる。

しかし、edコマンドは標準入力からのコマンドを必要とするため、xargs コマンドと相性が悪い。具体的には

find .... | xargs -i ed {} <<EOF
....
....
EOF

とした場合、ヒアドキュメントの中身はedコマンドではなくxargsに渡ってしまう。シェルからみたらedは単なるxargsの引数なのだから、これは当然の動きである。

ex (vim -e) コマンド

edコマンドと似たようなものでexコマンドがある。vimが使える環境ならたぶん入っているだろう。exコマンドはvim -eと同じで要するにvimなのである。
基本的にはedコマンドと似ていているが、違うのはコマンドを標準入力以外にもオプションで渡す事ができる事だ。(詳しくはman参照)

find ... | xargs -i ex -s +'%s/foo/bar/g' +'wq' {}

これで、一括置換&保存が可能。