findとsedを組み合わせて置換する

deck.jsを最新版にした際にハマったのでメモ。
やりたいことは、任意のフォルダにあるスライド(index.html)を再帰的に探して、
jquery-1.7.min.js
を、
jquery-1.7.2.min.js
にしたいだけ。

このページを参考にさせて貰いました。
findコマンドで再帰的にファイル削除オムニオラボ

例えば、こんな感じで格納されているファイルの中から、
“*.txt”を探して、そのファイルの中身の”abc”を”123″にする手順

.
├── 1
│   ├── aaa.txt
│   └── bbb.txt
├── 2
│   ├── ccc.txt
│   └── ddd.txt
└── 3
    └── eee.txt

“aaa.txt”,”bbb.txt”,”ccc.txt”,”ddd.txt”の中身は、
abc
“eee.txt”の中身は、
123

1. 拡張子が”.txt”を再帰的に探す
$ find . -name "*.txt"

2. sedを使って、該当箇所の置換結果を出力する
$ find . -name "*.txt" | xargs sed -n s/abc/123/p

3. sedを使って、(バックアップをしないで)置換処理を行う
$ find . -name "*.txt" | xargs sed -i "" s/abc/123/

まとめ

まずは、数文字程度しかないファイルを用意して、
置換する前と後を、以下のコマンドで確認しながら練習すると良い。
$ find . -name "*.txt" | xargs cat

あらかじめバックアップを取ってない場合は、
手順(3.)の-iオプションには、””ではなく、”.bak”を指定して、
置換処理と同時に、置換前のバックアップを取った方が良い。

最後に、MacOS Xで動作確認できたコマンドは以下の通り。
$ find . -name "*.html" | xargs sed -n s/1\.7\.min/1.7.2.min/p
$ find . -name "*.html" | xargs sed -i "" s/1\.7\.min/1.7.2.min/

実は、ここまで来る過程で、
置換した結果の2行以外すべて消えちゃうってことがあったので、
初めての場合は、バックアップを取ってから作業するのが良いと思う。

おしまい。

Leave a Comment