うめすこんぶ

日々のプログラミングで残しておきたいメモ.何かの役に立てれば幸いです.

sedを使って複数ファイルの文字列を一気に置換する

スポンサーリンク

本ブログ初のLinuxねた。

ファイルの特定の文字列を置換したいときがよくあります。 Emacsなら、M-x replace-stringで済むのですが、複数ファイルに一気に置換をかけたいときは Emacsだとめんどそう。ではどうするのか、と考えました。

結論

shellで以下のコマンドを実行。

find ファイル名 | xargs sed -i "s/置換前/置換後/g"
  • 「ファイル名」は、file-rev1.txt、file-rev2.txtとかならfile-rev*.txtなどで複数選択します。
  • sedは文字列置換のコマンドになります。
  • sed -iのオプション付きですと、ファイルの文字列を直接書き換えます。なぜこんなことを言うかというと、 sedは通常だと標準出力に出力されて、ファイル自体をいじらないからなのです。
  • find ディレクトリ名 -type fの形で、-type fのオプションを付けますと、ディレクトリ内のすべてのファイルを取り出す事ができます。-type dならファイルではなくディレクトリです。

参考

Linux上で複数ファイルから文字列を一括検索/置換するコマンド - スーパーソフトウエア 世界最強のホットテクノロジー - アプリ開発

どうでもいい余談:Emacsマクロを使ってやってみる

Emacsのマクロで無理やり↑と同じことをやります。

  1. diredでファイルリストを出し、置換をかけたいファイルのリストをコピペして、temp.txtなど適当な名前を付けてバッファに表示させておく。
  2. カーソルをファイルリストの1行目において、マクロ記録開始。
  3. 1行目のファイルの名前だけコピペ、M-x find-fileを行いペーストしたファイルを表示させる
  4. そのファイルにM-x replace-stringで置換をかける。
  5. ファイルリストのバッファに移動し、カーソルを2行目に合わせて、マクロ終了。

あとは、2.から5.までのマクロをファイル数分実行すればOK。マクロの繰り返し実行は、C-u 10 C-x eなどで行けます(こちらのコマンドは10回繰り返しの例)。

ちなみに、diredのリストに直接マクロかけようと思ったら、なぜか無効化されます。なのでここではわざわざファイルリストをコピペする手順をあえてしています。なぜできぬ…