かわたま.net

Enjoy Creative! かわたまのwebメモ

【Linux】複数あるファイルの中から特定の文字列を一括置換するコマンド

2014 August 01

Tag:

複数あるファイルの中から特定の文字列を一括置換したいときのLinuxコマンド。
このコマンドは実行したら修正できないので要注意。

find ./ -type f | xargs sed -i "s/hoge/fuga/g"

【上記コマンドの説明】

find
find の次で指定したディレクトリ以下のファイルを検索する。
ファイル検索の構文は「find [path] [検索条件] [アクション]」

./
今いるディレクトリ以下が検索対象。「~/」とするとホームディレクトリ以下が検索対象となる。
./ の代わりにフルパスでも可。この場合も指定したディレクトリ以下が検索対象になる。

-type f
指定したファイルタイプを検索する。fが通常ファイルを,cまたはdとするとディレクトリを,lとするとシンボリック・リンクを検索します。

xargs
標準入力からコマンドラインを作成し、それを実行する

sed
文字列の置換,行の削除を行う
sed の基本構文は「sed (オプション) [対象ファイル]」

-i
文字列を挿入する

s/置換条件/置換文字/g
置換条件はこれから置き換えたい、元の文字列。置換文字は置換後の文字列。
最後に g をつけた場合は。置換条件に一致した全ての文字列を置換文字に置き換える。

なぜこのコマンドは修正できないのか?

一度このコマンドを実行後、元の文字列または別の文字列に変更したい場合、他の関係のない文字列に干渉してしまう場合があるためです。

例えば、
「hogehogefugafugapiyopiyo」を
$ find ./ -type f | xargs sed -i "s/hoge/fuga/g"
で「fugafugafugafugapiyopiyo」に置換。

でもやっぱり元に戻したいので上記の逆をして
$ find ./ -type f | xargs sed -i "s/fuga/hoge/g"
としても、
「hogehogehogehogepiyopiyo」
こうにしかなりませんT T

大切なファイルのときは慎重に置換しましょう☆