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

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

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

答案1

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

awk '/^([^\t]|$)/{a++}END{print a}'

答案2

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

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

awk '!/^\t/ {a++} END {print a+0}' 

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

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

如果你想匹配空行,那么/^$/$0 == ""。或者匹配空行或仅包含空格的行/^[[:space:]]*$/

答案3

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

答案4

我读到匹配表达式 /^[^\t]/ 说的是“不以制表符开头的行”。如果您正在寻找真正的空行,这应该有效:

awk '/^$/{a +=1;};END{print a;}' /your/file/goes/here

'^' 表示行的开头,'$' 表示行的结尾,因此将它们放在一起意味着开头和结尾之间没有任何内容。我还没有检查这在 CR-LF 分隔行上的表现如何。

相关内容