複数のテキストファイル内の文字列をコマンドで一括置換する方法

Linuxテクニック

各サーバーソフトなどの設定ファイル、シェルスクリプト、あるいはPythonやPHPといったスクリプトファイルから特定の文字列を探し出し、一括で置換したいことってありますよね。
でも、文字列を置換するためだけにエディタでファイルを開くのも面倒です。ファイルが1つだけならまだいいですが、複数のファイルを処理する場合、1つずつ置換するなんてやっていられないでしょう。
そんな時に活躍するのが「sed」コマンドです。

以下は、「test.txt」内の「string1」をすべて、「string2」に置換する例です。ファイルは上書きされます。

sed -i 's/string1/string2/g' test.txt

最後の「g」を付けないと、1行につき1回しか置換処理が行われません。場合によっては便利ですが、「g」を付けて実行することのほうが多いでしょう。

上の例では、「string1」だけが置換されて、「STRING1」や「String1」は置換されません。大文字・小文字を区別せずに検索して置換するには、「I」を付けて以下のように実行します。

sed -i 's/string1/string2/gI' test.txt

以下のように、ファイルを複数指定することもできます。

sed -i 's/string1/string2/gI' test.txt test2.txt
sed -i 's/string1/string2/gI' *.conf

また、以下のように実行すれば、処理前のファイルが「ファイル名.bak」という名前でバックアップされます。「.bak」以外の文字列を指定することもできます。

sed -i.bak 's/string1/string2/gI' *.conf

サブディレクトリも含めて一括置換するなら、findコマンドを使って以下のように実行します。

find ./ -name '*.php' -exec sed -i 's/TYPO/TYPE/g' {} \;

この例だと、カレントディレクトリ以下から「*.php」に一致するファイルを探し、見つかったらファイルに対して「TYPO」を「TYPE」に置換して上書きする、という動作になります。
findからsedを実行する場合も、「-i.bak」などとしてバックアップファイルを作ることもできますし、「‘s/TYPO/TYPE/gI’」として「typo」や「Typo」なども「TYPE」に置換する、といったこともできます。

Linuxテクニック
\シェアお願いします/
LFI

コメント

タイトルとURLをコピーしました