awk - awk: gsub("\\\\", "\\\\") 产生令人惊讶的结果
问题描述
考虑以下输入:
$ cat a
d:\
$ cat a.awk
{ sub("\\", "\\\\"); print $0 }
$ cat a_double.awk
{ sub("\\\\", "\\\\"); print $0 }
现在运行cat a | awk -f a.awk
给出
d:\
和跑步cat a | awk -f a_double.awk
给
d:\\
我期望正好相反。我该如何解释这个?
$ awk -V
GNU Awk 4.1.4, API: 1.1 (GNU MPFR 4.0.1, GNU MP 6.1.2)
解决方案
是的,它的预期行为是awk
. 当您sub("\\", "\\\\")
在第一个脚本中运行时,在sub
's 内部"
(双引号)因为我们不使用/
匹配模式,我们需要先转义\
(实际文字字符)然后转义我们正在使用\
,所以我们也需要转义它,因此它会变成\\\\
\\ \\
| |
| |
first 2 chars are denoting escaping next 2 chars are denoting actual literal character \
您的第一种情况没有发生,因此没有匹配,因此没有替换,在您的第二个 awk 脚本中,您正在执行此操作(在 regex 匹配部分中转义部分sub
),因此它\
完美匹配。
让我们通过示例来看看这一点,并尝试将 put...
用于检查目的。
什么都没有发生时:因为没有匹配
awk '{sub("\\", "....\\\\"); print $0}' Input_file
d:\
当模式匹配发生时:
awk '{sub("\\\\", "...\\\\"); print $0}' Input_file
d:...\\
来自man awk
:
gsub(r, s [, t])
For each substring matching the regular expression r in the string t,
substitute the string s, and return the number of substitutions.
我们如何才能执行实际的转义部分(我们只需要\
在字符之前使用一次)?/../
请在 like的第一部分中提及您的正则表达式,sub
我们不需要\
在这里双重转义。
awk '{sub(/\\/,"&\\")} 1' Input_file
推荐阅读
- java - Android各个线程的优先级
- c - 在 C 中遍历数组时陷入无限循环
- oracle-cloud-infrastructure - 计算实例未启动
- jquery - 在 Rails 6 中设置 Bootstrap + jQuery + easyAutocomplete 时遇到问题
- r - 查询组的特定行以创建新列
- typescript - 我无法在 ionic 上导出 apk
- delphi - 接收“大”TCP 消息的问题
- spring-cloud-dataflow - spring数据云,测试任务,在kubernetes上运行,抛出maven repo错误
- angular - 如何构建一个大型 Angular 库
- python - PyQt5、Tensorflow、Keras 和 PyInstaller 的兼容版本集