web-dev-qa-db-ja.com

文字列をsedしてフォルダパスに置き換える方法

次のbashスクリプトを記述しようとしています。

HOME_DIR=/opt/my_home
find ./CONFIG -type f -exec sed -i "s/_HOME_DIR_/$_HOME_DIR/g" {} \;

ファイルで変更したい行は次のとおりです。

users                   = "_HOME_DIR_/config/data/_DOMAIN_/users.conf"

したがって、最終結果は次のようになります。

users                   = "/opt/my_home/config/data/_DOMAIN_/users.conf"

しかし、私はそれを得ていません...それはエスケープ文字のためだと思います...

誰もが光を当てることができますか?

ありがとう

14
Felipe Caldas

置換文字列またはパターン文字列にスラッシュが含まれる状況では、GNU sedが代替コマンドの代替区切り文字を許可するという事実を利用できます。区切り文字の一般的な選択は、パイプ文字|またはハッシュ#です。区切り文字の最適な選択は、多くの場合、処理されるファイルのタイプによって異なります。あなたの場合、あなたは試すことができます

sed -i "s#_HOME_DIR_#$HOME_DIR#"

また、変数名$ HOME_DIRを誤って入力したことに注意してください(アンダースコアで始まっていません)。

$ HOME_DIR=/opt/my_home
$ echo "_HOME_DIR_/config/data/_DOMAIN_/users.conf" | sed "s#_HOME_DIR_#$HOME_DIR#"
/opt/my_home/config/data/_DOMAIN_/users.conf

スクリプトのユーザー変数にall-capsを使用することを避けたい場合があります-システム変数用に予約する必要があります。また、1行で複数の置換を行う場合を除き、gスイッチは不要です。

23
steeldriver

変数「opt/home」をハードコーディングすると、このように機能します..

find ./CONFIG -type f -exec sed -i "s/\_HOME\_DIR\_/opt\/home/g" {} \;