1. ホーム
  2. linux

[解決済み] MacとLinuxでのテキストファイルの再帰的検索と置換

2022-04-27 08:54:54

質問

Linuxシェルで、次のコマンドを実行すると、「this」のすべてのインスタンスを再帰的に検索して「that」に置き換えることができる(目の前にLinuxシェルはないが、これでできるはずだ)。

find . -name "*.txt" -print | xargs sed -i 's/this/that/g'

OSXでの同様のコマンドはどのようなものになるのでしょうか?

解決方法は?

OS XはBSDとGNUのツールを混ぜて使っているので、常にドキュメントをチェックするのが一番です(ただし、私が持っていたのは less はOS Xのmanpageにさえ準拠していませんでした)。

https://web.archive.org/web/20170808213955/https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/sed.1.html

の後に引数を取ります。 -i をバックアップのための拡張子として使用します。空の文字列を指定する ( -i '' ) は、バックアップを行わない場合です。

以下のようにすればよい。

find . -type f -name '*.txt' -exec sed -i '' s/this/that/g {} +

-type f は単なるグッドプラクティスです。sedはディレクトリを与えたりすると文句を言います。

-exec よりも優先されます。 xargs をわざわざ使う必要はありません。 -print0 などがあります。

は、その {} + を意味します。 find は、結果ごとにコマンドを再実行するのではなく、呼び出されたコマンドの1つのインスタンスにすべての結果を引数として追加します。(一つの例外は、OSが許容するコマンドライン引数の最大数に違反している場合です; その場合は find は複数のインスタンスを実行します)。

もし、quot;invalid byte sequence,"のようなエラーが発生した場合、標準ロケールを強制するために LC_ALL=C のように、コマンドの最初に記述してください。

LC_ALL=C find . -type f -name '*.txt' -exec sed -i '' s/this/that/g {} +