为什么`awk '/^[^\t]/{a++}END{print a}'` 不计算空行?

Tim*_*Tim 6 awk regular-expression

为什么不awk '/^[^\t]/{a++}END{print a}'计算空行(即只有换行符的行)?不是以\ttab开头的空行吗?

ilk*_*chu 21

查找不包含 X 的内容与查找不包含 X 的行不同。

如果我们想查找以制表符开头的行,我们可以使用 regex /^\t/。要找到相反的情况,即不以制表符开头的行,将否定放在整个模式中(而不是在字符类中)可能是最简单的:

awk '!/^\t/ {a++} END {print a+0}' 
Run Code Online (Sandbox Code Playgroud)

a+0 这样计数为零的结果为零,而不是空。

另一方面,正则表达式[^\t]需要一些字符,它不能是制表符。

如果要匹配空行,则/^$/$0 == ""。或者匹配空行或仅带有空格的行/^[[:space:]]*$/


Hau*_*ing 20

原因是[^\t]需要一个字符。换行符 ( $) 不算作字符。你需要这个:

awk '/^([^\t]|$)/{a++}END{print a}'
Run Code Online (Sandbox Code Playgroud)


phe*_*mer 18

在正则表达式中,[^\t]并不意味着“匹配没有\t”。它的意思是“匹配除\t”之外的任何字符。关键的区别是必须有一个字符才能匹配。在空行的情况下,没有一个。