我试图匹配以下模式,但最终 \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”。
有人可以帮我解释一下为什么空间不匹配吗?
[ : ](在您的正则表达式中)是与单个空格或冒号匹配的字符类。默认情况下,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:]]匹配空格或制表符