指定ディレクトリ配下のテキストファイルを一括置換するコマンド
この前 GitHub のアカウント名を変更したので、各リポジトリ内のファイルに含まれる旧アカウントの文言を新アカウントに変更したくて調べた。
以下のようにすれば一気に置換できる。
$ grep -lr '置換対象の文字列' ./* | xargs sed -i.bak -e 's/置換対象の文字列/置換後の文字列/g'
例えば URL 文字列に含まれる「neos21github」を検索して「neos21」に変更する場合は以下のような感じ。
$ grep -lr 'neos21github' ./* | xargs sed -i.bak -e 's/neos21github/neos21/g'
grep
コマンドに指定したオプションは以下のとおり。
-l
: パターンを含むファイル名のみ返す (ちなみに-L
ならパターンを含まないファイル名のみを返す)-r
: サブディレクトリも対象にする-i
を付けていないので、大文字小文字を区別していることに注意
-l
オプションによってファイル名だけを列挙するので、それをパイプと xargs
で受け取り、sed
で置換する。
sed
コマンドに指定したオプションは以下のとおり。
-i
: 変更を入力ファイルに適用し、バックアップファイルを作る-i'.bak'
とか-i.bak
とか-i .bak
とかいった形でオプションの後ろに引数を渡すと、それを接尾辞にしてバックアップを作ってくれる。
-e
: この後ろに渡した式に沿って置換処理を行う。s/検索文字/置換文字/
: 条件に合致する文字列を置換する。末尾にg
を付けることで当てはまる全箇所を置換できる。
- 参考 : 複数のファイル内の文字列をまとめて置換するLinuxコマンド - Qiita
- 参考 : sed コマンドの用法 - Qiita
- 参考 : 【 sed 】 文字列の置換,行の削除を行う | 日経 xTECH(クロステック)
もし、sed
コマンドで sed: RE error: illegal byte sequence
といったエラーが出た時は、$ export LANG=C
と打つと直る。
- 参考 : Macの全置換で sed: RE error: illegal byte sequence が出たら - Qiita
- 参考 : MAC OSXでsedした時の sed: RE error: illegal byte sequence エラー - 渋谷ラーメン男道
sed
はちゃんと覚えなきゃな…。