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

时间:2017-04-07 12:45:02

标签: regex awk split gawk

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

我的问题是,为什么awk没有解释“。”作为“任何人物”的正则表达?

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

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

2 个答案:

答案 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.