CentOSで複数ファイル内の文字列を一括で書き換えるLinuxコマンド

CentOSで複数ファイル内の文字列を一括で書き換えるLinuxコマンド

一つずつ特定の文字列を検索して置き換えるという面倒な作業からの解放

CentOS内の特定ディレクトリ内で、特定の文字列を含むファイル内で、特定の文字列を別の文字列に置き換えるLinuxコマンドを紹介します。

grep -rl '置き換え前の文字列' ./ | xargs sed -i -e 's%置き換え前の文字列%置き換え後の文字列%g'

上記のコマンドでは、カレントディレクトリ内のフォルダ全てを対象に、’置き換え前の文字列’を含むファイルを検索し、’置き換え前の文字列’を’置き換え後の文字列’として置き換えます。

今回使用したLinusコマンドについて

grep <文字列> <ファイル名>で、特定のファイルから特定の文字列を含んでいるかを判別します。
grepオプション
-r => 下層ディレクトリ内を回帰的に検索
-l => grep検索結果にファイル名のみを表示させる

また、xargsの前にある|は「パイプ」といい、|の前の実行結果を|の後に引き渡して実行することが出来ますが、今回の場合はパラメータで渡す必要があるので、

| argsで

で繋ぎます。

sed (オプション) <対象ファイル>で、文字列の置換,行の削除を行います。
sedオプション
-i => 上書き保存する
-e => 指定したスクリプト(条件式)で変換処理を行う。変換処理内容を「-e」オプションを指定した後に記述します。
grep -e の条件式 => s/置換条件/置換文字/で、置換条件を置換文字に変換します。最後の/の後ろにgを付けた場合は置換条件に当てはまるすべての文字列が置換されます。

また今回の場合は、./でカレントディレクトリを指定し、一括置き換えしています。

エラー対応:「sへのオプションが未知です」

例えば、URLを置き換えたい場合

sed 's/http:test.com/http://test.jp/g'

みたいに、文字列内に/が含まれているため、どこで区切れば良いのかが分からない状態なので、極端な話、/以外のものを使えば良いということで、この場合は/ではなく%を使います。

#こっちが正解
sed 's%http:test.com%http://test.jp%g'