为什么awk '/^[^\t]/{a++}END{print a}'
不计算空行(即只有换行符的行)?空行不是不是以\t
tab开头吗?
答案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 分隔行上的表现如何。