回答:
OS XはBSDツールとGNUツールを組み合わせて使用しているため、常にドキュメントを確認することをお勧めします(ただしless
、OS Xのマンページに準拠していないドキュメントも確認しました)。
sedは、-i
バックアップの拡張子としてafterの引数を取ります。-i ''
バックアップしない場合は、空の文字列()を指定します。
次のことを行う必要があります。
LC_ALL=C find . -type f -name '*.txt' -exec sed -i '' s/this/that/ {} +
これ-type f
は良い習慣です。ディレクトリを指定すると、sedは文句を言うでしょう。
-exec
よりも優先されxargs
ます。-print0
何も気にする必要はありません。{} +
最後の手段でfind
はなく、と呼ばれるコマンドの1つのインスタンスに引数としてすべての結果を追加する各結果のためにそれを再実行しています。(1つの例外は、OSで許可されているコマンドライン引数の最大数に違反している場合です。その場合find
、複数のインスタンスが実行されます。)
%
文字を使用できますsed "s%localhost/site%blah/blah%"
。もう1つの方法は、セパレーターをバックスラッシュでエスケープすることですsed "s/localhost\/site/blah\/blah/"
。
illegal byte sequence
エラーを出している?もしそうなら、試してください:LC_ALL=C find . -type f -name '*.txt' -exec sed -i '' s/this/that/ {} +
それは私のために働いた。
/g
ように複数のocurrenciesためLC_ALL=C find . -type f -exec sed -i '' s/search/replace/g {} +
Macの場合、より類似したアプローチは次のようになります。
find . -name '*.txt' -print0 | xargs -0 sed -i "" "s/form/forms/g"
find . -name '*.php' -print0 | xargs -0 sed -i "" "s/easyform/form360/g"
代替ソリューションとして、Mac OSX 10.7.5でこれを使用しています
grep -ilr 'old-word' * | xargs -I@ sed -i '' 's/old-word/new-word/g' @
クレジットは次のとおりです:Todd Cesereの回答
上記のどれもOSXでは動作しません。
以下をせよ:
perl -pi -w -e 's/SEARCH_FOR/REPLACE_WITH/g;' *.txt
LinuxとMac OS Xの両方で動作するバージョン(に-e
スイッチを追加することによりsed
):
export LC_CTYPE=C LANG=C
find . -name '*.txt' -print0 | xargs -0 sed -i -e 's/this/that/g'
export LC_CTYPE=C && export LANG=C
私がこのコマンドを入力するときはいつでも、私はいつもそれをホースアップするか、フラグを忘れているようです。現在のディレクトリからグローバル検索置換を行うTaylanUBの回答に基づいてgithubにGistを作成しました。これはMac OSX固有です。
https://gist.github.com/nateflink/9056302
ターミナルをポップオープンしてコピーするだけでいいのです。
curl -s https://gist.github.com/nateflink/9056302/raw/findreplaceosx.sh | bash -s "find-a-url.com" "replace-a-url.com"
奇妙なバイトシーケンスエラーが発生する可能性があるため、以下に完全なコードを示します。
#!/bin/bash
#By Nate Flink
#Invoke on the terminal like this
#curl -s https://gist.github.com/nateflink/9056302/raw/findreplaceosx.sh | bash -s "find-a-url.com" "replace-a-url.com"
if [ -z "$1" ] || [ -z "$2" ]; then
echo "Usage: ./$0 [find string] [replace string]"
exit 1
fi
FIND=$1
REPLACE=$2
#needed for byte sequence error in ascii to utf conversion on OSX
export LC_CTYPE=C;
export LANG=C;
#sed -i "" is needed by the osx version of sed (instead of sed -i)
find . -type f -exec sed -i "" "s|${FIND}|${REPLACE}|g" {} +
exit 0
私はこの形式を使用しましたが、...非常に奇妙なすべてのインスタンスを実際に変更するには、3回以上実行する必要があることがわかりました。一度実行すると、すべてではなく各ファイルの一部が変更されます。まったく同じ文字列を2〜4回実行すると、すべてのインスタンスがキャッチされます。
find . -type f -name '*.txt' -exec sed -i '' s/thistext/newtext/ {} +
g
は最後にa を必要とします、そうでなければそれは行の最初の出現のみを置き換えthistext
ます。したがって、正規表現は次のようになりますs/thistext/newtext/g
https://bitbucket.org/masonicboom/serpは、OSXでテストされたgoユーティリティ(つまり、クロスプラットフォーム)であり、特定のディレクトリ内のファイル内のテキストを再帰的に検索および置換し、各置換を確認します。それは新しいので、バグがあるかもしれません。
使用法は次のようになります。
$ ls test
a d d2 z
$ cat test/z
hi
$ ./serp --root test --search hi --replace bye --pattern "*"
test/z: replace hi with bye? (y/[n]) y
$ cat test/z
bye
find . -type f | xargs sed -i '' 's/string1/string2/g'
参照してくださいここで詳細は。
OSXでのコマンドは、きれいなUIでのUnixとまったく同じである必要があります。
-print0
に追加find
フラグと-0
するxargs
フラグ。
-exec sed -i s/this/that/g {} \+
代わりに使用することもできます-print
xargs
、スペースで区切られた「./jacobus」がに渡されるファイルとして表示されsed
、「R.txt」 、どちらも存在しません。
"。"の代わりに$ PWDとだけ言うことができます
apple.stackexchange.com
Linuxやすべての開発者にとって一般的ではないため、おそらくに移動する必要があります。