293
4

14 に答える 14

126

これは 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にスペースが必要''です。
于 2011-04-17T15:36:42.493 に答える
25

Noufal Ibrahimが尋ねるように、Perl を使用できないのはなぜですか? すべての Mac には Perl が搭載されており、ベース システムに一部のバージョンの Perl が含まれていない Linux または BSD ディストリビューションはほとんどありません。実際に Perl を欠いている可能性のある唯一の環境の 1 つは BusyBox です (-iバックアップ拡張機能を指定できないことを除いて、GNU/Linux for のように動作します)。

ismailが推奨するように、

perl はどこでも利用できるので、perl -pi -e s,foo,bar,g target.file

sed -iこれは、GNU/Linux と BSD/Mac の間の根本的な非互換性に対処するためのスクリプト、エイリアス、またはその他の回避策よりも、ほとんどの場合に優れたソリューションのようです。

于 2014-03-07T10:39:16.380 に答える
17

それを機能させる方法はありません。

1 つの方法は、次のような一時ファイルを使用することです。

TMP_FILE=`mktemp /tmp/config.XXXXXXXXXX`
sed -e "s/abc/def/" some/file > $TMP_FILE
mv $TMP_FILE some/file

これは両方で機能します

于 2013-02-18T23:07:14.483 に答える
15

答え:いいえ

最初に受け入れられた回答は、実際には要求されたことを実行しません (コメントに記載されているように)。file-e(ディレクトリに a が「ランダムに」表示される理由を探しているときに、この回答を見つけました。)

sed -iMacOS と Linux の両方で一貫して動作させる方法はないようです。

私の推奨は、それが価値があるため、sed(複雑な障害モードがある) でその場で更新するのではなく、新しいファイルを生成し、後でそれらの名前を変更することです。言い換えれば、避けてください-i

于 2012-07-04T09:38:45.653 に答える
12

この-iオプションはPOSIX Sedの一部ではありません。より移植性の高い方法は、Ex モードで Vim を使用することです。

ex -sc '%s/alfa/bravo/|x' file
  1. %すべての行を選択

  2. s交換

  3. x保存して閉じます

于 2016-11-24T13:50:34.347 に答える
7

Steve Powell の答えは非常に正しいです。OSX および Linux (Ubuntu 12.04) での sed の MAN ページを参照すると、2 つのオペレーティング システム間での「インプレース」sed 使用における非互換性が強調されています。

参考までに、sed の Linux バージョンを使用する場合、-i と引用符 (空のファイル拡張子を示す) の間にスペースを入れないでください。

sed Linux マニュアルページ

#Linux
sed -i"" 

sed OSXのマニュアルページ

#OSX (notice the space after the '-i' argument)
sed -i "" 

エイリアス化されたコマンドと「 uname」のOS名出力をbash「if」内で使用することにより、スクリプトでこれを回避しました。OS 依存のコマンド文字列を変数に格納しようとすると、引用符を解釈するときにヒットとミスがありました。スクリプト内で定義されたエイリアスを展開/使用するには、' shopt -s expand_aliases ' の使用が必要です。shopt の使用法はここで扱われます

于 2012-10-03T23:58:06.243 に答える
1

sedスクリプトでインプレースを実行する必要がありbash、そのインプレースで .bkp ファイルを生成したくない場合、および os を検出する方法 (たとえば、ostype.shを使用) がある場合 -- 次に、bashシェルビルトインを使用した次のハックが機能するevalはずです。

OSTYPE="$(bash ostype.sh)"

cat > myfile.txt <<"EOF"
1111
2222
EOF

if [ "$OSTYPE" == "osx" ]; then
  ISED='-i ""'
else # $OSTYPE == linux64
  ISED='-i""'
fi

eval sed $ISED 's/2222/bbbb/g' myfile.txt
ls 
# GNU and OSX: still only myfile.txt there

cat myfile.txt
# GNU and OSX: both print:
# 1111
# bbbb

# NOTE: 
# if you just use `sed $ISED 's/2222/bbbb/g' myfile.txt` without `eval`,
# then you will get a backup file with quotations in the file name, 
# - that is, `myfile.txt""`
于 2017-10-02T11:22:32.047 に答える
-2

Linux および OS X では、次のように動作します。

sed -i' ' <expr> <file>

たとえば、次fを含むファイルの場合aaabbaaba

sed -i' ' 's/b/c/g' f

aaaccaacaLinux と Mac の両方で生成されます。と文字列の間にスペースを入れずに、スペースを含む引用符付き文字列があることに注意してください。一重引用符または二重引用符の両方が機能します。-i

Linux ではbashUbuntu 14.04.4 でバージョン 4.3.11 を使用し、Mac では OS X 10.11.4 El Capitan (Darwin 15.4.0) でバージョン 3.2.57 を使用しています。

于 2016-04-19T15:24:08.733 に答える