awk,gsub,&符号和意外扩展

时间:2017-04-02 18:28:49

标签: bash shell awk gsub gawk

首先,对可能重复的问题道歉。我是bash脚本的新手,我甚至无法找出一些要搜索的关键字。话虽如此,我尽可能地简化问题描述:

我有一个只包含以下行的文本文件(test.txt):

REPLACE

我运行了以下命令,该命令应该用代码变量值REPLACE替换文件的文本(即if (A & B))。

code="if (A & B)" ; awk -v var="${code}" '{ gsub(/REPLACE/, var); print }' test.txt

预期输出我希望code变量值按原样打印:

if (A & B)

实际输出以某种方式将&符号扩展为'REPLACE',即gsub regexp参数:

if (A REPLACE B)

也许我需要逃避&符号,但不幸的是,code变量填充不受我的控制,所以我不能手动操纵它的值。

FYI awk版本是“GNU Awk 4.1.4,API:1.1(GNU MPFR 3.1.5,GNU MP 6.1.2)”

谢谢!

1 个答案:

答案 0 :(得分:4)

&是许多工具中的反向引用元字符,它表示“与您搜索的正则表达式匹配的字符串”。如果您尝试使用文字字符串,则使用文字字符串而不是正则表达式和反向引用。

e.g:

code="if (A & B)"
awk -v old="REPLACE" -v new="$code" 's=index($0,old){$0=substr($0,1,s-1) new substr($0,s+length(old))} 1' test.txt

尝试对正则表达式和替换进行处理的替代方案很复杂且容易出错,并且通常不适合胆小的人,请参阅:Is it possible to escape regex metacharacters reliably with sed