$0 中的 awk gsub 也更改变量
awk gsub in $0 changes variable as well
我正在尝试将进入 awk 的文本分配给一个变量,然后更改 $0,然后输出原始字符串和更改后的字符串:
# echo "This is a test" |awk '{text=[=10=]; gsub(/ /,"%20"); print $text; print [=10=];}'
This%20is%20a%20test
This%20is%20a%20test
但我希望 return
This%20is%20a%20test
This is a test
尝试更改 #text 变量会做同样的事情。
# echo "This is a test" |awk '{text=[=12=]; $text gsub(/ /,"%20"); print $text; print [=12=];}'
This%20is%20a%20test
This%20is%20a%20test
GNU Awk 4.1.3,API:Synology 运行 DSM 6.2
上的 1.1(GNU MPFR 3.1.3、GNU MP 6.0.0)
以下内容可能对您有所帮助。在 awk
中,$
表示特定字段的值,它不像 shell.
那样工作
echo "This is a test" | awk '{val=[=10=];gsub(/ /,"%20",val);print val ORS [=10=]}'
This%20is%20a%20test
This is a test
让我们分析一下您的原始代码行:
awk '{text=[=10=]; gsub(/ /,"%20"); print $text; print [=10=];}'
text=[=13=]
: 很简单你把当前记录存入变量text
gsub(/ /,"%20")
:这会将字符串 [=17=]
中的所有空格替换为 %20
。这是根据 POSIX standard:
gsub(ere, repl[, in])
Behave like sub
, except that it shall replace all occurrences of the regular expression ere
in [=17=]
or in the in
argument, when specified.
应该理解,这个替换是inplace。因此 [=17=]
现在已更新并且不同于 text
。
print $text
: 这是罪魁祸首,你想做 print text
但你写了 $text
。 POSIX standard 状态:
Field variables shall be designated by a $
followed by a number or numerical expression.
正如您所写的那样 $text
并且 text
当前是一个字符串,它会尝试将字符串转换为它期望的数字。由于失败,转换 returns ZERO
和此时 $text
等同于 [=17=]
代表当前记录(您之前用 gsub
).
print [=35=]
: 这里打印当前记录。
结论:
如果您期望以下输出:
This%20is%20a%20test
This is a test
下面的两行 awk
给出了这个:
awk '{text=[=12=]; gsub(/ /,"%20",text); print text; print [=12=])'
awk '{text=[=12=]; gsub(/ /,"%20"); print [=12=]; print text }'
我正在尝试将进入 awk 的文本分配给一个变量,然后更改 $0,然后输出原始字符串和更改后的字符串:
# echo "This is a test" |awk '{text=[=10=]; gsub(/ /,"%20"); print $text; print [=10=];}'
This%20is%20a%20test
This%20is%20a%20test
但我希望 return
This%20is%20a%20test
This is a test
尝试更改 #text 变量会做同样的事情。
# echo "This is a test" |awk '{text=[=12=]; $text gsub(/ /,"%20"); print $text; print [=12=];}'
This%20is%20a%20test
This%20is%20a%20test
GNU Awk 4.1.3,API:Synology 运行 DSM 6.2
上的 1.1(GNU MPFR 3.1.3、GNU MP 6.0.0)以下内容可能对您有所帮助。在 awk
中,$
表示特定字段的值,它不像 shell.
echo "This is a test" | awk '{val=[=10=];gsub(/ /,"%20",val);print val ORS [=10=]}'
This%20is%20a%20test
This is a test
让我们分析一下您的原始代码行:
awk '{text=[=10=]; gsub(/ /,"%20"); print $text; print [=10=];}'
text=[=13=]
: 很简单你把当前记录存入变量text
gsub(/ /,"%20")
:这会将字符串[=17=]
中的所有空格替换为%20
。这是根据 POSIX standard:gsub(ere, repl[, in])
Behave likesub
, except that it shall replace all occurrences of the regular expressionere
in[=17=]
or in thein
argument, when specified.应该理解,这个替换是inplace。因此
[=17=]
现在已更新并且不同于text
。print $text
: 这是罪魁祸首,你想做print text
但你写了$text
。 POSIX standard 状态:Field variables shall be designated by a
$
followed by a number or numerical expression.正如您所写的那样
$text
并且text
当前是一个字符串,它会尝试将字符串转换为它期望的数字。由于失败,转换 returnsZERO
和此时$text
等同于[=17=]
代表当前记录(您之前用gsub
).print [=35=]
: 这里打印当前记录。
结论:
如果您期望以下输出:
This%20is%20a%20test
This is a test
下面的两行 awk
给出了这个:
awk '{text=[=12=]; gsub(/ /,"%20",text); print text; print [=12=])'
awk '{text=[=12=]; gsub(/ /,"%20"); print [=12=]; print text }'