【ファイル内の文字列を置換して上書き保存する】
書式
perl -p -i -e ‘s/検索文字列/置換文字列/g’ 対象ファイル名
-p…入力ファイルから1行ずつ取り出して処理し、表示する。
-i…ファイルを修正する。拡張子を指定すると、その拡張子でバックアップを取ってくれます。
-e…直後に続く部分をスクリプトとして処理する。
s/検索文字列/置換文字列/g…文字列の置換。検索文字列を置換文字列に置き換える。最後の「g」(gスイッチ)を指定すると、1行に複数検索文字列がある場合、全て置換してくれる。なければ最初の1個だけ置換。
【複数ファイル内の文字列を置換して上書き保存する】
書式
find [検索開始ディレクトリ] [オプション] -exec perl -p -i -e ‘s/検索文字列/置換文字列/g’ {} \;
例1)
find . -type f -exec perl -p -i -e 's/test/test/g' {} \;
例2)拡張子等を限定するとき
find ./*.txt -type f -exec perl -p -i -e 's/test/test/g' {} \;
例3)指定したディレクトリ以下をすべて置き換えしたいとき
find . -name '*.txt' -type f -exec perl -p -i -e 's/test/test/g' {} \;
としたいところですが、これだとfindで検索対象のテキストファイルの更新日付が全て新しくなってしまいました。
正解は以下になります。
find . -name '*.txt' -type f | xargs grep -l 'test' | xargs perl -p -i -e 's/test/test/g'
拡張子を限定しないと、JPGやGIFファイルのバイナリファイルでもなんでもアクセスしてしまうので注意すべし。
詳しくはこちら→[findとgrepを使ってファイルの中身を一括検索と置換]