$ 0中的awk gsub也会更改变量

时间:2018-06-21 02:41:20

标签: variables awk gsub

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

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

但是我希望它会回来

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

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

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

运行DSM 6.2的Synology上的GNU Awk 4.1.3,API:1.1(GNU MPFR 3.1.3,GNU MP 6.0.0)

2 个答案:

答案 0 :(得分:1)

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

echo "This is a test" | awk '{val=$0;gsub(/ /,"%20",val);print val ORS $0}'
This%20is%20a%20test
This is a test

答案 1 :(得分:1)

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

awk '{text=$0; gsub(/ /,"%20"); print $text; print $0;}'
  • text=$0:非常简单,您可以将当前记录存储在变量text
  • gsub(/ /,"%20"):这将在字符串%20中用$0替换所有空格。根据{{​​3}}:

      

    gsub(ere, repl[, in])   行为与sub相似,不同之处在于它应替换ere$0自变量中指定的所有出现的正则表达式in

    应该理解,这种替换是 inplace 。因此,$0现在已更新,并且与text不同。

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

      

    字段变量应由$后跟数字或数字表达式表示。

    在您写$text并且text当前是一个字符串时,它将尝试将字符串转换为期望的数字。如果失败,转换将返回ZERO,此时$text相当于表示当前记录(您先前用$0更新的gsub)。

  • print $0:在这里打印当前记录。

结论:

如果您期望以下输出:

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

以下两行awk为此:

awk '{text=$0; gsub(/ /,"%20",text); print text; print $0)'
awk '{text=$0; gsub(/ /,"%20"); print $0; print text }'