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

Rem*_*mon 4 bash shell awk gawk gsub

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

我有一个仅包含这一行的文本文件 (test.txt):

REPLACE
Run Code Online (Sandbox Code Playgroud)

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

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

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

if (A & B)
Run Code Online (Sandbox Code Playgroud)

实际输出不知何故与号被扩展为“REPLACE”,这是正则gsub表达式参数:

if (A REPLACE B)
Run Code Online (Sandbox Code Playgroud)

也许我需要摆脱 & 符号,但不幸的是,code可变人口超出了我的控制范围,因此我无法手动操作其值。

仅供参考 awk 版本是“GNU Awk 4.1.4,API:1.1(GNU MPFR 3.1.5,GNU MP 6.1.2)”

谢谢!

Ed *_*ton 5

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

例如:

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
Run Code Online (Sandbox Code Playgroud)

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