0

PHP定数を必要なものに置き換えるBashスクリプトがありますdefine('xxxx',....);

に:

sudo sed -E -i "" "s/^(define).*(${2})[\'|\"].*/${3}/g" "$file"

問題は、Ubuntuではiの後に余分なスペースがあるために失敗することです。

-i ""

そのスペースを削除すると、Ubuntuでは機能しますが、MacOSでは機能しません(エラーが発生するなど)。

sed: 1: "../config.php ...": invalid command code

* nix全体でこのコマンドを平和的に実行するためのオプションは何ですか?

時間と知識をよろしくお願いします。

4

4 に答える 4

2
sudo perl -pi -e "s/^(define).*(${2})[\'|\"].*/${3}/g" "$file"

でも、あなたは本当に意味がある['\"]のではないかと思います。

于 2012-05-30T07:15:35.460 に答える
1

-sedのiオプションはGNU方言の一部です。これは移植性がありません。

1つの代替方法は、一時的な中間ファイルを使用することです。

sed ... ${file} > ${file}.tmp && mv ${file}.tmp ${file}

もう1つは、tripleで提案されているように、sedの代わりにperlを使用することです。

于 2012-05-30T07:20:06.533 に答える
1

操作をインプレースで実行し、バックアップファイルの作成を抑制または回避するために、オペレーティングシステムを条件として配列を設定できます。

[[ $(uname -s) == 'Darwin' ]] && ioption=(-i "") || ioption=(-i)
sed "${ioption[@]}" "s/^(define).*(${2})['\"].*/${3}/g" "$file"

引用符で囲まれた引数と複数のオプション/引数がすべて機能するように、配列が使用されます。追加のものを条件付きにしたい場合は、配列にさらに追加することができます。

パイプは角かっこ式内の代替文字ではないことに注意してください。代わりに、文字通り含まれています。したがって、パイプを潜在的に一致させたい場合を除いて、それを省略する必要があります。外側の二重引用符の内側では、一重引用符をエスケープする必要はありません。

于 2012-05-31T01:36:19.733 に答える
0

GNUsedをOSXにインストールし、それを使用します。

于 2012-05-30T07:04:26.100 に答える