具有双引号和环境变量的字符串的正则表达式

时间:2017-05-30 08:57:15

标签: regex sed

使用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。

2 个答案:

答案 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