GNU/Linux >> Linux の 問題 >  >> Linux

Mac (BSD) と Linux の両方で機能する sed インプレース フラグ

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 の間。


Linux
  1. Linux.htaccessのヒントとコツ

  2. Linux での sed コマンドの例

  3. ファイルを見つけて、Linux でそのディレクトリに cd します

  1. (C/C++) Windows と Linux の両方で実行できる実行可能ファイルを生成する方法は?

  2. Linuxファイル記述子0 1 2がstdin、stdout、およびstderrではない可能性はありますか?

  3. Mac と Linux の両方を使用した効率的なキー バインド

  1. Linux Sedコマンド:使用法と例

  2. Linuxで出力をファイルとStdoutにリダイレクトする方法

  3. Linux でサポートおよび推奨されるファイル システム