毎回Linux環境で複数ファイルを対象とした文字列置換コマンドを忘れるのでメモ

▼関連記事



複数ファイルの中身を書き換えるコマンド

コマンドの基本形


複数のファイル内に共通する文字列を、任意の文字列で置き換える

コマンド:
find {path} -name "{file_name}" -or -name "{file_name}" | xargs sed -i "s/{置き換えられる文字列}/{置き換える文字列}/g"

置き換え文字説明
{path}findで探索するディレクトリ最上位./
{file_name}ワイルドカード「*」を含むことのできるファイル名*.log
{置き換えられる文字列}テキスト内で置き換え対象の文字列hoge
{置き換える文字列}テキスト内を置き換える文字列hogehoge

「-or」で検索するファイル名を複数種類に拡張することができます。
「-name "{file_name}"」を「-type f」のようにすると、すべてのファイルが対象になります。

オプション説明
-iファイルの上書き保存
s文字列の置換
g行の最初にマッチした文字以外も全て置換
-p実行されるコマンドの確認用xargsのオプション

コマンド:
find ./ -type f | xargs -p sed -i "s/hoge/hogehoge/g"
このように「-p」オプションをxargsを付けると、コマンドを実行する前に実行されるコマンドを確認することができます。

「sed -i "s/hoge/hogehoge" {この後に複数ファイル名}」のように表示されると、複数ファイルが対象のsedコマンドが実行されることが分かります。

コマンドの使用例

特殊文字を含む文字列を置き換える

sedコマンドには以下のような特殊文字がいくつかあります。
特殊文字説明
'.'任意の文字列ワイルドカード
'['文字集合の開始
'\'エスケープ。特殊文字のエスケープやグループに用いる
'*'0個以上の繰り返しにマッチ
'^'行頭
'$'行末

コマンド:
find ./ -name "*.js" | xargs sed -i "s/camera\.position/maincamera\.positions/g"
「camera.position」を「maincamera.positions」のように置き換えようと思った場合、「.」はそのままだとワイルドカードとして認識されるため、
  • 「camera.position」
  • 「camera/position」
この2つが存在した場合、どちらも「maincamera.positions」に置き換わります。ここでは、バックスラッシュ「\」を用いることで、特殊文字として認識されないような工夫が必要です。

sedコマンド

ファイル内文字列の置換


このエントリーをはてなブックマークに追加