awk 脚本不适用于 gsub $10

awk 脚本不适用于 gsub $10

我有很多套用信函需要生成。

    $>cat debug-form-letter
    The first field is $1, the second $2, the third $3,
    the 10th field is $10,but  the 10th correct value  is varA.



    $> cat debug-replace-value
    var1|var2|var3|var4|var5|var6|var7|var8|var9|varA|varB



    $> cat debug-replace-form-letter.awk
    BEGIN {FS = "|"
                       while (getline <"debug-form-letter")
                       line[++n] = $0
       }
    {for (i = 1; i <= n; i++) {  
                       s = line[i]         
                       for (j = 1; j <= NF; j++)  
                                  gsub("\\$"j, $j, s)
                       print s
               }
       }

我通过这个打电话

    $> awk -f debug-replace-form-letter.awk debug-replace-value 

--10 我想要这样

    The first field is var1, the second var2, the third var3,

    the 10th field is varA,but  the 10th correct value  is varA.

--20 但我明白了

    The first field is var1, the second var2, the third var3,

    the 10th field is var10,but  the 10th correct value  is varA.

上面的 $10 不正确,它变成了 $1 加 0,我尝试双引号和单引号,它也不起作用。

并且 11 美元变成 1 美元加 1。

我的 awk 是 4.1.3 ,我更新到最新版本它也不起作用。

    $> awk -V
    GNU Awk 4.1.3, API: 1.1
    Copyright (C) 1989, 1991-2015 Free Software Foundation.

我的脚本出了什么问题?我怎样才能让它工作?

答案1

替换时,您还需要替换(and 、等)$1的初始部分。 被替换为so被替换为(以及 ) 剩下的部分。$10$11$12$1var1$10var10var10$10

您必须更加具体地使用正则表达式,以便仅匹配您所关心的特定数字,仅此而已。

有两种正确执行此操作的方法:

  1. 修改替换中的正则表达式,使其匹配正确的内容(困难)。
  2. 首先匹配最长的字符串,例如按照 from $10to$1而不是 from $1to的顺序替换它们$10(或者无论您有多少变量)。

使用第二个选项:

awk 'NR == FNR { split($0, vars, "|"); next }
     { for (i = length(vars); i >= 1; --i) gsub("\\$" i, vars[i]) } 1' debug-replace-value debug-form-letter

对于给定的文本,这会生成

The first field is var1, the second var2, the third var3,
the 10th field is varA,but  the 10th correct value  is varA.

相关内容