2017-05-30 8 views
1

を持つ文字列のために、私は環境変数との二重引用符を含む文字列を交換する必要があります。正規表現SEDを使用して二重引用符や環境変数

BUCKET_FOLDER=\"dev\" 

(または「DEV」のいずれかの誘導体)に変換する必要があります:

BUCKET_FOLDER=bucket1/$ID 

$ ID = ABCDE、すなわち

BUCKET_FOLDER=bucket1/abcde 

$のID、環境変数を展開するには、私が必要

sed -e "s/BUCKET_FOLDER=\\"(.*?)\\"/BUCKET_FOLDER=bucket1\/$ID/g" $string 

が、これはその後、元の文字列に二重引用符で試合を妨げている:sedの置換式を二重引用符を配置します。

アドバイスありがとうございます。それは2つの段階で動作させることができるが、sedにsepratorよう|を使用1.

答えて

1
ID=abcde 

echo 'A=\"x\" BUCKET_FOLDER=\"dev\" B=\"y\"' |sed -r "s|(.*)(BUCKET_FOLDER=)([^ ]+)(.*)|\1\2bucket1/$ID\4|g" 

A = \ "X \" BUCKET_FOLDER =のbucket1/ABCDE B = \ "のY \"

を好みます。前述のとおり、二重引用符を使用して$IDを展開し、最初のグループとしてBUCKET_FOLDER=を取得しました。

+0

ありがとう、それはかなり近いです。私が持っている唯一の問題は、BUCKET_FOLDER = \ "dev \"は長い文字列の一部なので、* globのような正規表現ではすべてを長い文字列の最後に置き換えています。実際のソース文字列は 'A = \ "x \" BUCKET_FOLDER = \ "dev \" B = \ "y \"'のようになります –

+0

もう一度閉じます。出力が今すぐBUCKET_FOLDER = bucket1/abcde \ "dev \" –

+0

@ GarrethMcDaidはそれを修正しようとしました。これがうまくいかない場合は、私の投稿を削除することを知らせてください。 –

0

sedコマンドで引用符を正しくエスケープしたと思います。一方、正規表現の残りの部分を指定する方法は、正規表現の仕方ではありません。ここでは物語の私の感想は次のとおりです。

echo BUCKET_FOLDER='"'dev'"' | \ 
sed -e "s/BUCKET_FOLDER=\"\(.*\?\)\"/BUCKET_FOLDER=bucket1\/$ID/g" 

説明:

  • は、私はあなたの$string変数に\"部品だけでエスケープシーケンスをしていることを前提に作られました。したがって、私はecho BUCKET_FOLDER='"'dev'"'コマンドを使用しました。出力はBUCKET_FOLDER="dev"です。
  • 貪欲でない修飾子は、.*\?のようになります。私。疑問符をエスケープする必要があります。
  • 括弧もエスケープする必要があります:\(...\)\1のような逆参照を使用しないので、これはグループなしでも機能するはずです。

代替:

あなたはキャプチャグループを排除したい場合は、sedの式はこのようになります。

sed -e "s/BUCKET_FOLDER=\".*\?\"/BUCKET_FOLDER=bucket1\/$ID/g" 

バックスラッシュが本当にあなたの文字列の一部である場合は、それらを一致させることができます文字クラス[\]

echo BUCKET_FOLDER=\\'"'dev\\'"' | \ 
sed -e "s/BUCKET_FOLDER=[\]\".*\?[\]\"/BUCKET_FOLDER=bucket1\/$ID/g 
+0

バックスラッシュは文字列の一部です。 JVMに余分なパラメータを送る/ etc/sysconfig/tomcat7設定ファイルからのものです。 –

関連する問題