使用sed,我需要用环境变量替换包含双引号的字符串:
BUCKET_FOLDER=\"dev\"
(或' dev'的任何衍生产品)需要转换为:
BUCKET_FOLDER=bucket1/$ID
其中$ ID = abcde,即
BUCKET_FOLDER=bucket1/abcde
要展开$ ID环境变量,我需要在sed替换表达式周围添加双引号:
sed -e "s/BUCKET_FOLDER=\\"(.*?)\\"/BUCKET_FOLDER=bucket1\/$ID/g" $string
但这阻止了源字符串中双引号的匹配。
非常感谢任何建议。我可以使用2个步骤,但更喜欢1。
答案 0 :(得分: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 \"
在|
中使用sed
作为seprator。如您所述,使用双引号展开$ID
并抓取BUCKET_FOLDER=
作为第一组。
答案 1 :(得分: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