我正在尝试使用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