我试图将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)
答案 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
,但您写了$text
。 POSIX 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 }'