【问题标题】:awk gsub in $0 changes variable as well$0 中的 awk gsub 也会更改变量
【发布时间】:2018-11-30 06:12:27
【问题描述】:

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

【问题讨论】:

  • 我不认为你的第一个例子正在做你认为它正在做的事情。尝试将您从问题中包含的命令行复制到 shell 中,您就会明白我的意思。然后尝试从print $text 中删除美元符号的相同命令行,并让我们知道您的结果。

标签: variables awk gsub


【解决方案1】:

让我们分析一下你原来的代码行:

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

    gsub(ere, repl[, in]) 表现得像sub,除了它应该替换所有出现在$0in 参数中的正则表达式ere(如果指定)。

    应该理解,这个替换是inplace的。因此$0 现已更新,与text 不同。

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

    字段变量应由$ 指定,后跟数字或数值表达式。

    当您编写$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 }'

【讨论】:

    【解决方案2】:

    以下内容可能会对您有所帮助。在 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
    

    【讨论】:

    • 在 gawk 中,甚至可以在没有变量的情况下执行此操作:gawk '{print gensub(/ /,"%20","g",$0) ORS $0}' <<<"This is a test"
    猜你喜欢
    • 1970-01-01
    • 2017-03-21
    • 2021-03-21
    • 2018-04-16
    • 2021-11-03
    • 2016-10-28
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    相关资源
    最近更新 更多