使用 awk 打印从匹配到文件末尾的行

fed*_*qui 5 regex awk

打印文件中从匹配行到文件末尾的行中,我了解到您可以使用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/,/!./' aawk '/matched/,0' a返回:

matched
2

3
4
end
Run Code Online (Sandbox Code Playgroud)

awk '/matched/,!NF' a返回:

匹配的
2

anu*_*ava 4

你感叹的地方不对。将其保留在正则表达式之外,如下所示以否定匹配

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