![为什么 `awk '/^[^\t]/{a++}END{print a}'` 不计算空行?](https://linux22.com/image/125066/%E4%B8%BA%E4%BB%80%E4%B9%88%20%60awk%20'%2F%5E%5B%5E%5Ct%5D%2F%7Ba%2B%2B%7DEND%7Bprint%20a%7D'%60%20%E4%B8%8D%E8%AE%A1%E7%AE%97%E7%A9%BA%E8%A1%8C%EF%BC%9F.png)
为什么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 分隔行上的表现如何。