$0 中的 awk gsub 也更改变量

awk gsub in $0 changes variable as well

我正在尝试将进入 awk 的文本分配给一个变量,然后更改 $0,然后输出原始字符串和更改后的字符串:

# echo "This is a test" |awk '{text=[=10=]; gsub(/ /,"%20"); print $text; print [=10=];}' 
This%20is%20a%20test
This%20is%20a%20test

但我希望 return

This%20is%20a%20test
This is a test

尝试更改 #text 变量会做同样的事情。

# echo "This is a test" |awk '{text=[=12=]; $text gsub(/ /,"%20"); print $text; print [=12=];}' 
This%20is%20a%20test
This%20is%20a%20test

GNU Awk 4.1.3,API:Synology 运行 DSM 6.2

上的 1.1(GNU MPFR 3.1.3、GNU MP 6.0.0)

以下内容可能对您有所帮助。在 awk 中,$ 表示特定字段的值,它不像 shell.

那样工作
echo "This is a test" | awk '{val=[=10=];gsub(/ /,"%20",val);print val ORS [=10=]}'
This%20is%20a%20test
This is a test

让我们分析一下您的原始代码行:

awk '{text=[=10=]; gsub(/ /,"%20"); print $text; print [=10=];}'
  • text=[=13=]: 很简单你把当前记录存入变量text
  • gsub(/ /,"%20") :这会将字符串 [=17=] 中的所有空格替换为 %20。这是根据 POSIX standard:

    gsub(ere, repl[, in]) Behave like sub, except that it shall replace all occurrences of the regular expression ere in [=17=] or in the in argument, when specified.

    应该理解,这个替换是inplace。因此 [=17=] 现在已更新并且不同于 text

  • print $text : 这是罪魁祸首,你想做 print text 但你写了 $textPOSIX standard 状态:

    Field variables shall be designated by a $ followed by a number or numerical expression.

    正如您所写的那样 $text 并且 text 当前是一个字符串,它会尝试将字符串转换为它期望的数字。由于失败,转换 returns ZERO 和此时 $text 等同于 [=17=] 代表当前记录(您之前用 gsub ).

  • print [=35=]: 这里打印当前记录。

结论:

如果您期望以下输出:

This%20is%20a%20test
This is a test

下面的两行 awk 给出了这个:

awk '{text=[=12=]; gsub(/ /,"%20",text); print text; print [=12=])'
awk '{text=[=12=]; gsub(/ /,"%20"); print [=12=]; print text }'