lbu*_*tlr 3 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
Run Code Online (Sandbox Code Playgroud)
但我期待着它的回归
This%20is%20a%20test
This is a test
Run Code Online (Sandbox Code Playgroud)
尝试更改 #text 变量会产生同样的效果。
# echo "This is a test" |awk '{text=$0; $text gsub(/ /,"%20"); print $text; print $0;}'
This%20is%20a%20test
This%20is%20a%20test
Run Code Online (Sandbox Code Playgroud)
运行 DSM 6.2 的 Synology 上的 GNU Awk 4.1.3、API:1.1(GNU MPFR 3.1.3、GNU MP 6.0.0)
让我们分析一下你的原始代码行:
awk '{text=$0; gsub(/ /,"%20"); print $text; print $0;}'
Run Code Online (Sandbox Code Playgroud)
text=$0:非常简单,您将当前记录存储在变量中textgsub(/ /,"%20"):这会替换%20字符串中的所有空格$0。这是根据POSIX 标准:
gsub(ere, repl[, in])行为类似于sub,不同之处在于,当指定时,它将替换参数ere中$0或参数中所有出现的正则表达式in。
应该理解,这个替换是到位的。因此$0现在已更新并不同于text.
print $text:这就是罪魁祸首,你想做print text但你写了$text。POSIX标准规定:
字段变量应由
$后跟数字或数值表达式来指定。
正如您所写$text,text当前是一个字符串,它会尝试将字符串转换为它期望的数字。当失败时,转换将返回ZERO,此时的 this$text相当于$0代表当前记录(您之前使用 更新过的记录gsub)。
print $0:在这里打印当前记录。
综上所述:
如果您期望以下输出:
This%20is%20a%20test
This is a test
Run Code Online (Sandbox Code Playgroud)
以下两awk行给出了这一点:
awk '{text=$0; gsub(/ /,"%20",text); print text; print $0)'
awk '{text=$0; gsub(/ /,"%20"); print $0; print text }'
Run Code Online (Sandbox Code Playgroud)