在打印文件中从匹配行到文件末尾的行中,我了解到您可以使用0范围表达式来awk匹配直到文件末尾:
awk '/matched/,0' file
Run Code Online (Sandbox Code Playgroud)
然而,今天我开始尝试这个0,我发现这也有效:
awk '/matched/,/!./' file
Run Code Online (Sandbox Code Playgroud)
我想0这是有效的,因为在范围表达式中/regex1/,/regex2/,行会被打印,直到regex2计算结果为 True。由于0评估结果为 False,因此这种情况永远不会发生,并且最终会打印所有行。这是正确的吗?
然而,/!./我想这会起作用,直到找到没有任何字符的行,就像我们说的那样awk '/matched/,!NF'。但事实并非如此:相反,它的计算结果始终为 False。这是什么原因呢?
$ cat a
1
matched
2
3
4
end
Run Code Online (Sandbox Code Playgroud)
两者awk '/matched/,/!./' a都awk '/matched/,0' a返回:
matched
2
3
4
end
Run Code Online (Sandbox Code Playgroud)
而awk '/matched/,!NF' a返回:
匹配的 2
你感叹的地方不对。将其保留在正则表达式之外,如下所示以否定匹配:
awk '/matched/,!/./' a
Run Code Online (Sandbox Code Playgroud)
匹配的 2
您的正则表达式/!./匹配文字!后跟任何字符。
如果你的文件是这样的:
cat a
1
matched
2
3
!4
end
Run Code Online (Sandbox Code Playgroud)
然后
awk '/matched/,/!./' a
matched
2
3
!4
Run Code Online (Sandbox Code Playgroud)
和:
awk '/matched/,!/./' a
Run Code Online (Sandbox Code Playgroud)
匹配的 2