如何在 awk 中通过正则表达式匹配空格或 \s

shi*_*ang 1 awk

我试图匹配以下模式,但最终 \s 不匹配。不知道我错过了什么。

这是示例文件。

There was a farmer, who had a dog
and Bingo : nameo
Bingo: nameio
Run Code Online (Sandbox Code Playgroud)

我使用以下来匹配“Bingo\s*:\s*”之后的字符串

awk '{for(i=1; i<=NF; i++) if($i~/Bingo[ : ]*/) print $(i+1)}' sample.log
Run Code Online (Sandbox Code Playgroud)

在第一次匹配后期待字符串“nameo”,但我得到“:”,第二次匹配就很好,我得到“nameio”。

有人可以帮我解释一下为什么空间不匹配吗?

dan*_*dan 5

[ : ](在您的正则表达式中)是与单个空格或冒号匹配的字符类。默认情况下,awk 字段按空格分割,因此Bingo : 是两个字段,而不是一个。默认情况下,字段永远不会包含空格。

我可能会添加:到默认字段分隔符正则表达式:

awk -v FS='[[:space:]:]+' '{
    for (i=1; i<=NF; i++) {
        if ($i == "Bingo") {
            print $(i+1)
        }
    }
}'
Run Code Online (Sandbox Code Playgroud)

尽管这确实将字符串分成foo:bar两个字段。如果这有问题,也许是这样的:

awk '
{
    for (i=1; i<=NF; i++) {
        if ($i == "Bingo" && $(i+1) = ":") {
            print $(i+2)
        }
    }
}'
Run Code Online (Sandbox Code Playgroud)

回答你的标题,\sawk 无效。除了原始空间 ( ) 之外,还有:

  • [[:space:]]匹配任何空白字符(空格、制表符、换行符、回车符、换页符、垂直制表符)
  • [[:blank:]]匹配空格或制表符