如果我们有ip=192.168.0.1
并且我们呼叫split(ip, myArray, ".")
,myArray将在位置1包含“192”,在位置2包含“168”,在位置3包含“0”而在位置4包含“1”
我的问题是,为什么awk没有解释“。”作为“任何人物”的正则表达?
如果我想让awk解释为“。”,我需要做什么?作为匹配的“任何字符”正则表达式?
这种行为在所有awk实现中是否一致?
答案 0 :(得分:5)
这实际上是awk的一个黑暗角落....
5年前我有同样的怀疑。我提交了bug并与gawk的开发人员交谈,最后明确了。这是" 功能"。
这是门票:https://lists.gnu.org/archive/html/bug-gawk/2013-03/msg00009.html
if (request.IsPasswordGrantType())
{
var user = await _userManager.FindByNameAsync(request.Username);
if (user == null){
return BadRequest(new OpenIdConnectResponse {
Error = OpenIdConnectConstants.Errors.InvalidGrant,
ErrorDescription = "The username/password couple is invalid."
});
}
split(str, array, magic)
:
当你使用非空字符串(由magic
引用)""
时,awk将检查字符串的长度,如果它是单个字符,它将用作文字string(他们称之为分隔符)。但是,如果它长于"..."
,则会将其视为动态正则表达式。
当您使用静态正则表达式时,即1
格式,无论表达式有多长,它都将被视为正则表达式。
那是:
/.../
如果你希望awk将"." - literal "." (period)
"[" - literal "["
"{" - literal "{"
".*" - regex
/./ - regex
/whatever/ -regex
视为正则表达式元字符,你应该使用.(period)
但是如果你用任何字符分割,你可能有空数组,如果这是你真正想要的。
答案 1 :(得分:0)
您应该使用/./
来区分正则表达式和静态字符串,以将每个字符串用作分隔符:
$ echo 192.168.0.1 | awk '{ split($0,a,/./); print a[1] }'
$ # nothing here, every char is a delimiter.