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のマクロで無理やり↑と同じことをやります。
- diredでファイルリストを出し、置換をかけたいファイルのリストをコピペして、temp.txtなど適当な名前を付けてバッファに表示させておく。
- カーソルをファイルリストの1行目において、マクロ記録開始。
- 1行目のファイルの名前だけコピペ、
M-x find-file
を行いペーストしたファイルを表示させる - そのファイルに
M-x replace-string
で置換をかける。 - ファイルリストのバッファに移動し、カーソルを2行目に合わせて、マクロ終了。
あとは、2.から5.までのマクロをファイル数分実行すればOK。マクロの繰り返し実行は、C-u 10 C-x e
などで行けます(こちらのコマンドは10回繰り返しの例)。
ちなみに、diredのリストに直接マクロかけようと思ったら、なぜか無効化されます。なのでここではわざわざファイルリストをコピペする手順をあえてしています。なぜできぬ…