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


14

次の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"

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

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

ありがとう


つまり、いくつかの光をs(h)ed
アレクサンドルホールデンデーリー14年

回答:


23

置換文字列またはパターン文字列にスラッシュが含まれる状況では、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を使用するのを避けたい場合があります-システム変数用に予約する必要があります。また、g1行で複数の置換を行う場合を除き、スイッチは不要です。


0

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

find ./CONFIG -type f -exec sed -i "s/\_HOME\_DIR\_/opt\/home/g" {} \;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.