Linux 在awk中转义一个变量,但不转义另一个变量

Linux 在awk中转义一个变量,但不转义另一个变量,linux,bash,shell,awk,centos,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

我在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\u VAR=$OTHER\u VAR:/folder/bin
by
export OTHER\u VAR=$OTHER\u VAR:some\u text:/folder/bin

我希望我说清楚了

提前谢谢

西尔万

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"
注意一些变化:

  • 我们正在将正则表达式中的
    $
    转义为
    [$]
    。与
    \$
    不同的是,它在所有引用上下文中被一致地解析:它显式地生成一个正则字符类,而不是具有任何其他潜在意义
  • 对文字字符串使用单引号可以确保在字符串中不会发生shell插值
  • 使用
    {print}
    awk
    中的纯
    1
    更容易让读者理解
  • 不包括对OS或shell有意义的变量名,在变量名中使用小写字符符合POSIX指定的约定。见,第4段
注意一些变化:

  • 我们正在将正则表达式中的
    $
    转义为
    [$]
    。与
    \$
    不同的是,它在所有引用上下文中被一致地解析:它显式地生成一个正则字符类,而不是具有任何其他潜在意义
  • 对文字字符串使用单引号可以确保在字符串中不会发生shell插值
  • 使用
    {print}
    awk
    中的纯
    1
    更容易让读者理解
  • 不包括对OS或shell有意义的变量名,在变量名中使用小写字符符合POSIX指定的约定。见,第4段

为什么在awk代码周围使用双引号?这使得shell可以在其内部进行替换,但是如果您做得正确,那么只有awk变量(比如您使用
-v
创建的变量)应该在awk代码中被引用。此外,MYVAR=export OTHER\u VAR=\$OTHER\u VAR:some\u text`实际上不是有效的shell赋值。也许你的意思是
MYVAR='export OTHER\u VAR=$OTHER\u VAR:some\u text'
?(您不需要在单引号中使用反斜杠)。请尝试将您的代码设为a,以便其他人可以运行它,并且不会出现与您的问题无关的错误。也就是说,就我个人而言,如果我遇到您的问题,我将使用
gsub\u literal
from。感谢您的帮助,我刚刚添加了[$]正如RavinderSingh13所说的那样,为什么在awk代码中使用双引号呢?这使得shell可以在其内部进行替换,但是如果您做得正确,那么只有awk变量(比如您使用
-v
创建的变量)应该在awk代码中被引用。此外,MYVAR=export OTHER\u VAR=\$OTHER\u VAR:some\u text`实际上不是有效的shell赋值。也许你的意思是
MYVAR='export OTHER\u VAR=$OTHER\u VAR:some\u text'
?(你不需要在单引号中使用反斜杠)。请尝试将你的代码设为a,这样其他人就可以运行它,而不会出现与你的问题无关的错误。也就是说,就我个人而言,如果我有你的问题,我会使用
gsub_literal
from。谢谢你的帮助,我刚刚按照RavinderSingh13的说法添加了[$],效果很好谢谢![$]救了我的命;)非常感谢。[$]救了我的命;)