awk split()函数使用正则表达式还是精确的字符串常量?

May*_*orn 4 regex awk split gawk

如果我们有ip=192.168.0.1并且我们打电话split(ip, myArray, "."),myArray将在位置1包含"192",在位置2包含"168",在位置3包含"0"而在位置4包含"1".

我的问题是为什么awk没有解释"." 作为"任何人物"的正则表达?

如果我想让awk解释为".",我需要做什么.作为匹配的"任何字符"正则表达式?

这种行为在所有awk实现中是否一致?

Ken*_*ent 9

这真是一个黑暗的角落......

大约5年前,我有同样的怀疑.我提交了bug并与gawk的开发人员交谈,最后明确了.这是一个" 特色 ".

这是门票:https://lists.gnu.org/archive/html/bug-gawk/2013-03/msg00009.html

split(str, array, magic)
Run Code Online (Sandbox Code Playgroud)

用于magic:

  • 当你使用非空字符串(引用"")时"...",awk将检查字符串的长度,如果它是单个字符串,它将被用作文字字符串(它们称之为分隔符).但是,如果它长于1,它将被视为动态正则表达式.

  • 当你使用静态正则表达式,这意味着,/.../无论表达式有多长,它都将被视为正则表达式.

那是:

"."  - literal "." (period)
"["  - literal "["
"{"  - literal "{"
".*" - regex
/./  - regex
/whatever/ -regex
Run Code Online (Sandbox Code Playgroud)

如果你想要awk .(period)作为正则表达式元字符处理,你应该使用split(foo,bar,/./)But如果你被任何一个字符分割,你可能有空数组,如果这是你真正想要的.