awk-v bailing-out/无法打开文件,因为replace字段中存在变量



我正在尝试使用awk(暂时)输入一个包含模式第n个匹配项以上变量的字符串。我的实际目标是修改real_printf.c文件的内容,方法是在return (0);的第二个匹配项的正上方添加行,例如包含printf("%s%d%s", str00,int01,str03);。我正在创建一个随机printf生成器,作为学校项目的自我奖励(->在.c中重新编码printf),并且已经可以输入随机变量声明、%和转换指标之间的转换标志等。这是我得到一个工作原型之前的最后一步。

我已经有了匹配return (0);的awk命令,但我遇到了第一个错误,说我除以0,从而结束了awk执行。请参阅以下代码:

1)awk '/return/{c++;if(c==2){ print "ttprintf("'$input_pf'", '$var_name');"; c=1 }} 1' .annex/real_printf.c

在阅读了许多在线资源后,我通过使用awk-v并声明变量,将上面的代码更改为下面的代码,纠正了这个错误:

2)awk -v input="$input_pf" name="$var_name" "/return/{c++;if(c==2){ print "\t\tprintf("$input", $name);"; c=1 }} 1" .annex/real_printf.c

对于上面的代码,shell返回了以下错误:

awk -v input=%p name=ptr00 '/return/{c++;if(c==2){ print ttprintf("",' ')'
awk: can't open file /return/{c++;if(c==2){ print ttprintf("",
source line number 1
+ '; c=1 }} 1' .annex/real_printf.c
.annex/modify/pct_conv.sh: line 34: ; c=1 }} 1: command not found

所以我决定删除awk-v后面的变量周围的双引号,请参阅下面的代码

3)awk -v input=$input_pf name=$var_name "/return/{c++;if(c==2){ print "\t\tprintf("$input", $name);"; c=1 }} 1" .annex/real_printf.c

我现在得到了以下结果,并且缺乏尝试的想法:

awk -v input=%f%o%s name=f00,o01,str02 '/return/{c++;if(c==2){ print ttprintf("",' ')'`
`awk: syntax error at source line 1
context is
``>>> name=f00,o01, <<<``
awk: bailing out at source line 1
+ '; c=1 }} 1' .annex/real_printf.c
.annex/modify/pct_conv.sh: line 34: ; c=1 }} 1: command not found

这应该是一个语法问题,或者我可能在一行中向awk要求太多。也许awk甚至不是解决这个问题的最佳工具。为了进入我模式的第二场比赛,我尝试了sed -i '' 's/return (0);/printf("$input_pf", $var_name)/2',但它都不起作用。

你将如何处理这个问题?

# assign some values so we can test
input_pf=%f%o%s
var_name=f00,o01,str02
# sample input to exercise the code
input=$(cat <<'EOF'
return
return
return
return
EOF
)
# actual code here
awk -v input="$input_pf" -v name="$var_name" '
/return/ {
if(count++ > 0) {
printf "ttprintf("%s", %s);n", input, name
}
}
1 { print }' <<<"$input"

注:

  • 我们在每个name=value对之前放置一个单独的-v。如果没有这一点,第二个name=value对将被视为awk脚本,之后的参数将被视作为输入文件名
  • 我们总是用双引号引用shell展开式
  • 我们将awk代码放在单个引号中,这样它就不会被shell破坏
  • 在引用awk变量时,我们不使用$(因为这只是shell语法)

有了这些变化,上面正确地(据我所知,问题中没有给出样本输入或输出)返回:

return
printf("%f%o%s", f00,o01,str02);
return
printf("%f%o%s", f00,o01,str02);
return
printf("%f%o%s", f00,o01,str02);
return

相关内容

最新更新