variables - $0 中的 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
但我期待它会回来
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)
解决方案
让我们分析您的原始代码行:
awk '{text=$0; gsub(/ /,"%20"); print $text; print $0;}'
text=$0
:非常简单,您将当前记录存储在变量中text
gsub(/ /,"%20")
:这将替换%20
字符串中的所有空格$0
。这是根据POSIX 标准:gsub(ere, repl[, in])
表现得像sub
,除了它应该替换参数ere
中$0
或in
参数中所有出现的正则表达式,当指定时。应该理解,这种替换是就地的。因此
$0
现在已更新且不同于text
.print $text
: 这是罪魁祸首,你想做print text
却写了$text
。POSIX 标准规定:字段变量应由 a 指定,
$
后跟数字或数值表达式。正如您所写
$text
并且text
当前是一个字符串,它会尝试将字符串转换为预期的数字。当它失败时,转换返回ZERO
,此时 this$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 }'
推荐阅读
- r - 如果字符串在字段 A 中匹配,则复制行并将第二个字符串添加到 B 行
- python - 如何制作图像集合中不为空的像素计数的直方图
- typescript - 打字稿中重载函数的参数的行为是什么?
- javascript - Photoshop 脚本根据活动选择裁剪为正方形
- vue.js - 为什么 npm ci 比 3 个月前慢得多?
- ios - xcode新构建系统找不到依赖文件
- pdfbox - 如何使用 Java Apache PDFBox 查找 PDF 中的所有内部链接
- system-verilog - 来自 SV 等待语句的跨模块引用解析错误
- python - 如何删除日期时间格式中的“:”?Python
- python - 在 python 中使用 Pillow 将图像列表转换为 gif 时,仅在 gif 中显示最后一帧