14 に答える
これは 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
にスペースが必要''
です。
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 の間の根本的な非互換性に対処するためのスクリプト、エイリアス、またはその他の回避策よりも、ほとんどの場合に優れたソリューションのようです。
それを機能させる方法はありません。
1 つの方法は、次のような一時ファイルを使用することです。
TMP_FILE=`mktemp /tmp/config.XXXXXXXXXX`
sed -e "s/abc/def/" some/file > $TMP_FILE
mv $TMP_FILE some/file
これは両方で機能します
答え:いいえ
最初に受け入れられた回答は、実際には要求されたことを実行しません (コメントに記載されているように)。file-e
(ディレクトリに a が「ランダムに」表示される理由を探しているときに、この回答を見つけました。)
sed -i
MacOS と Linux の両方で一貫して動作させる方法はないようです。
私の推奨は、それが価値があるため、sed
(複雑な障害モードがある) でその場で更新するのではなく、新しいファイルを生成し、後でそれらの名前を変更することです。言い換えれば、避けてください-i
。
この-i
オプションはPOSIX Sedの一部ではありません。より移植性の高い方法は、Ex モードで Vim を使用することです。
ex -sc '%s/alfa/bravo/|x' file
%
すべての行を選択s
交換x
保存して閉じます
Steve Powell の答えは非常に正しいです。OSX および Linux (Ubuntu 12.04) での sed の MAN ページを参照すると、2 つのオペレーティング システム間での「インプレース」sed 使用における非互換性が強調されています。
参考までに、sed の Linux バージョンを使用する場合、-i と引用符 (空のファイル拡張子を示す) の間にスペースを入れないでください。
#Linux
sed -i""
と
#OSX (notice the space after the '-i' argument)
sed -i ""
エイリアス化されたコマンドと「 uname」のOS名出力をbash「if」内で使用することにより、スクリプトでこれを回避しました。OS 依存のコマンド文字列を変数に格納しようとすると、引用符を解釈するときにヒットとミスがありました。スクリプト内で定義されたエイリアスを展開/使用するには、' shopt -s expand_aliases ' の使用が必要です。shopt の使用法はここで扱われます。
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""`
Linux および OS X では、次のように動作します。
sed -i' ' <expr> <file>
たとえば、次f
を含むファイルの場合aaabbaaba
sed -i' ' 's/b/c/g' f
aaaccaaca
Linux と Mac の両方で生成されます。と文字列の間にスペースを入れずに、スペースを含む引用符付き文字列があることに注意してください。一重引用符または二重引用符の両方が機能します。-i
Linux ではbash
Ubuntu 14.04.4 でバージョン 4.3.11 を使用し、Mac では OS X 10.11.4 El Capitan (Darwin 15.4.0) でバージョン 3.2.57 を使用しています。