用sed中的环境变量值替换双引号之间的字符串

时间:2017-08-29 00:18:17

标签: regex sed double-quotes

全部, 我有一个C头文件,我们称之为 test.h ,如下所示:

    <img src="img/img.jpg"  id="image1" onclick=diffImage(this) style="display:block" class ="image1"/>
    <img src="img/img2.jpg" id="image2" onclick=diffImage(this) style="display:none"/>
    <p id = "imgMessage"></p>
    <button onclick = "changeStyle()"> Change</button>

我想用一个名为 $ test 的环境变量的值替换它(让我们假设值是&#34; new_value&#34;)。这就是我设置它的方式:

#define KNOWN_STRING "replace_this"

这样test.h将如下所示:

setenv test new_value

我尝试了这个sed命令:

#define KNOWN_STRING "new_value"

这里的推理是匹配双引号之间的任何(零个或多个?)字符。但我得到了:无与伦比的&#39;。

我也试过这个:

sed -i -E 's/KNOWN_STRING "(.+)"/KNOWN_STRING "'"$test"'"/g test.h

但我得到了:无与伦比的#34;。

我猜我的正则表达式不正确。任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

使用sed

您需要使引号匹配。例如,以下内容有效:

$ sed -E 's/KNOWN_STRING "(.+)"/KNOWN_STRING "'"$test"'"/g' test.h
#define KNOWN_STRING "new_value"

如果您对自己所需的语句感到满意,可以添加-i选项以便就地修改文件。

请注意,如果变量test包含任何未转义的sed-active字符,则此方法将失败。

使用awk

Awk可以做一些非常相似的事情,但没有活跃角色的潜在缺陷:

$ awk -v test="$test" '{gsub(/KNOWN_STRING ".+"/, "KNOWN_STRING \"" test "\"")} 1' test.h
#define KNOWN_STRING "new_value"

使用GNU awk(有时称为gawk),可以在适当的位置更改文件:

awk -i inplace -v test="$test" '{gsub(/KNOWN_STRING ".+"/, "KNOWN_STRING \"" test "\"")} 1' test.h