在awk中转义一个变量而不是另一个变量

时间:2017-10-02 15:14:29

标签: linux bash shell awk centos

我在Linux中遇到awk问题。我想让这个脚本工作:

awk -v var="$MYVAR" "{gsub(/export OTHER_VAR=\$OTHER_VAR:/, "var")}1" /etc/myfile

这里的问题是我希望变量“var”被解释(它工作)而变量$ OTHERVAR不被解释,这就是我无法做到的事情。

最后,我想这样做:

我有一个变量

MYVAR=export OTHER_VAR=\$OTHER_VAR:some_text

我想在/ etc / myfile中替换以下模式:

export OTHER_VAR=$OTHER_VAR:/folder/bin的{​​p> export OTHER_VAR=$OTHER_VAR:some_text:/folder/bin

我希望自己明白......

提前致谢!

西尔

2 个答案:

答案 0 :(得分:2)

test_document='export OTHER_VAR=$OTHER_VAR:whatever'

search_regex='^export OTHER_VAR=[$]OTHER_VAR:'
replace_str='export OTHER_VAR=$OTHER_VAR:some_text:'

awk -v search_regex="$search_regex" \
    -v replace_str="$replace_str" \
'{gsub(search_regex, replace_str)} {print}' <<<"$test_document"

...正确地作为输出发出:

export OTHER_VAR=$OTHER_VAR:some_text:whatever

请注意一些变化:

  • 我们将正则表达式中的$转义为[$]。与\$不同,它在所有引用上下文中一致地进行解析:显式生成正则表达式字符类,而不是具有任何其他潜在含义。
  • 对文字字符串使用单引号可确保不会在其中进行shell插值。
  • 使用{print}让读者比1中的awk更容易理解。
  • 排除对OS或shell有意义的变量名,在变量名中使用小写字符符合POSIX指定的约定。见http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html,第四段。

答案 1 :(得分:0)

基于您希望将文本替换为新文本的Input_file的假设,您的问题并不是100%清楚。

假设您的Input_file包含以下内容。

cat Input_file
export OTHER_VAR=$OTHER_VAR:/folder/bin

现在,下面的代码将在包含字符串OTHER_VAR的行中添加some_text。

awk '/export OTHER_VAR/{sub(/:/,":some_text:")} 1'  Input_file

输出如下。

export OTHER_VAR=$OTHER_VAR:some_text:/folder/bin