OSX では、ほとんどのスクリプトが GNU sed バージョン用に作成されているため、スクリプトの問題を回避するために、常に Homebrew を介して GNU sed バージョンをインストールします。
brew install gnu-sed --with-default-names
その後、BSD sed は GNU sed に置き換えられます。
別の方法として、デフォルト名なしでインストールすることもできますが、その場合:
PATH
を変更してくださいgnu-sed
をインストールした後の指示どおり- スクリプトをチェックインして
gsed
から選択してください またはsed
システムに応じて
これは GNU sed では機能しますが、OS X では機能しません:
sed -i -e 's/foo/bar/' target.file
sed -i'' -e 's/foo/bar/' target.file
これは OS X では機能しますが、GNU sed では機能しません:
sed -i '' -e 's/foo/bar/' target.file
OS X では
sed -i -e
は使用できません バックアップ ファイルの拡張子は-e
に設定されるため、sed -i'' -e
は使用できません 同じ理由で-i
の間にスペースが必要です と''
.
本当に sed -i
だけを使いたい場合 「簡単な」方法として、以下は GNU と BSD/Mac の両方で動作します sed
:
sed -i.bak 's/foo/bar/' filename
スペースとドットの不足に注意してください。
証明:
# GNU sed
% sed --version | head -1
GNU sed version 4.2.1
% echo 'foo' > file
% sed -i.bak 's/foo/bar/' ./file
% ls
file file.bak
% cat ./file
bar
# BSD sed
% sed --version 2>&1 | head -1
sed: illegal option -- -
% echo 'foo' > file
% sed -i.bak 's/foo/bar/' ./file
% ls
file file.bak
% cat ./file
bar
明らかに、 .bak
を削除できます ファイル。
Noufal Ibrahim が尋ねるように、Perl を使用できないのはなぜですか?すべての Mac には Perl が搭載されており、ベース システムに一部のバージョンの Perl が含まれていない Linux または BSD ディストリビューションはほとんどありません。実際に Perl を欠いている唯一の環境の 1 つは、BusyBox (-i
の GNU/Linux のように動作します) です。 ただし、バックアップ拡張子は指定できません)。
ismail が推奨するように、
<ブロック引用>
perl はどこでも利用できるので、 perl -pi -e s,foo,bar,g target.file
を実行するだけです
sed -i
の根本的な非互換性に対処するためのスクリプト、エイリアス、またはその他の回避策よりも、ほとんどの場合、これが優れたソリューションのように思えます。 GNU/Linux と BSD/Mac の間。