Mac の場合、より類似したアプローチは次のようになります:
find . -name '*.txt' -print0 | xargs -0 sed -i "" "s/form/forms/g"
別の解決策として、私はこれを Mac OSX 10.7.5 で使用しています
grep -ilr 'old-word' * | xargs [email protected] sed -i '' 's/old-word/new-word/g' @
クレジットは次のとおりです:Todd Cesere の回答
OS X は BSD ツールと GNU ツールを組み合わせて使用するため、常にドキュメントを確認することをお勧めします (私は less
を持っていましたが)。 OS X のマンページにも準拠していませんでした):
https://web.archive.org/web/20170808213955/https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/sed.1.html
sed は -i
の後に引数を取ります バックアップの拡張子として。空の文字列 (-i ''
) バックアップなし。
次のことを行う必要があります:
find . -type f -name '*.txt' -exec sed -i '' s/this/that/g {} +
-type f
良い習慣です。ディレクトリなどを指定すると、sed は文句を言います。
-exec
xargs
より優先されます; -print0
を気にする必要はありません
{} +
最後に find
を意味します 結果ごとに再実行するのではなく、呼び出されたコマンドの 1 つのインスタンスにすべての結果を引数として追加します。 (1 つの例外は、OS で許可されているコマンドライン引数の最大数に違反した場合です。その場合、find
複数のインスタンスを実行します。)
「無効なバイト シーケンス」などのエラーが発生した場合は、LC_ALL=C
を追加して標準ロケールを強制すると役立つ場合があります。 コマンドの開始時に、次のように:
LC_ALL=C find . -type f -name '*.txt' -exec sed -i '' s/this/that/g {} +