如何在awk中定义临时变量并缩放gsub返回值以修正规则生成?
问题解决方法
你的代码存在两个关键问题:
- awk不支持bash的
$((...))算术扩展语法,直接使用普通算术表达式即可完成计算。 - if语句未用花括号包裹后续两行代码,导致只有
width赋值属于if分支,$i的赋值会无条件执行——当字段不匹配\_时,width未定义,就会出现空值,最终生成错误的\\rule[-0.1ex]{em}{0.5pt}内容。
正确的awk实现代码如下:
{ for (i=1; i<=NF; ++i) { if ($i ~ /\\_/) { # 先获取替换次数,计算缩放后的宽度 replace_cnt = gsub(/\\_/, "", $i) scaled_width = replace_cnt * 0.5 $i = "\\rule[-0.1ex]{" scaled_width "em}{0.5pt}" $i } } } 1
也可以简化为更紧凑的写法,直接在字符串拼接中完成计算:
{ for (i=1; i<=NF; ++i) if ($i ~ /\\_/) { $i = "\\rule[-0.1ex]{" (gsub(/\\_/, "", $i)*0.5) "em}{0.5pt}" $i } } 1
说明
gsub(/\\_/, "", $i)会返回替换的\_数量,将其乘以0.5即可得到缩放后的宽度;- 必须用花括号
{}将if分支下的多行代码包裹,确保只有匹配规则的字段才会被修改; - awk中直接用
*进行乘法运算,无需额外语法包裹。
内容的提问来源于stack exchange,提问作者Photon
相关产品推荐
相关产品推荐

