gpt4 book ai didi

variables - $0 中的 awk gsub 也更改变量

转载 作者:行者123 更新时间:2023-12-02 20:22:40 25 4
gpt4 key购买 nike

我正在尝试将进入 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

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

最佳答案

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

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

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

    应该理解,这种替代是就地。因此 $0 现在已更新并且不同于 text

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

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

    正如您编写的 $texttext 当前是一个字符串,它会尝试将字符串转换为它期望的数字。当它失败时,转换返回 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 }'

关于variables - $0 中的 awk gsub 也更改变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50959596/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com