在Print lines in file from the match line until end of file我了解到您可以在0
中的范围表达式中使用awk
来匹配,直到文件末尾:
awk '/matched/,0' file
然而,今天我开始玩这个0
,我发现这也有效:
awk '/matched/,/!./' file
我猜0
正在运行,因为在范围表达式/regex1/,/regex2/
中,行被打印,直到regex2
计算为True。由于0
的计算结果为False,因此不会发生这种情况,最终会打印出所有行。这是对的吗?
但是,使用/!./
我会想到这一点,直到找到没有任何字符的行,就像我们说awk '/matched/,!NF'
一样。但事实并非如此:相反,它总是评估为False。这是什么原因?
$ cat a
1
matched
2
3
4
end
awk '/matched/,/!./' a
和awk '/matched/,0' a
都返回:
matched
2
3
4
end
awk '/matched/,!NF' a
返回:
matched 2
答案 0 :(得分:3)
你在错误的地方感叹。将它保持在正则表达式之外,以否定匹配:
awk '/matched/,!/./' a
matched 2
您的正则表达式/!./
与文字!
匹配,后跟任何字符。
如果您的文件是:
cat a
1
matched
2
3
!4
end
然后
awk '/matched/,/!./' a
matched
2
3
!4
和
awk '/matched/,!/./' a
matched 2