我想知道如何wc
工作?大多数时候它似乎返回行数,但有时它似乎是换行符?在手册页中它的换行符。但:
[jiewmeng@JM textFiles]$ echo -e "\n\n" | wc -
3 0 3 -
Run Code Online (Sandbox Code Playgroud)
如果上面返回换行符的数量,它应该只返回 2?我也得到了这个奇怪的文件:
[jiewmeng@JM textFiles]$ cat testA.txt
The quick
brown fox
jumped over
the lazy
dog.[jiewmeng@JM textFiles]$ wc testA.txt
4 9 50 testA.txt
Run Code Online (Sandbox Code Playgroud)
在上述情况下,它似乎返回了换行符的数量?
X T*_*ian 13
在您的第一个示例中,echo 将在末尾添加它的换行符,您可以通过将 -n 选项添加到 echo 来停止此操作。
wc 计算字符、单词和行数,行被定义为零个或多个以换行符 ( \n
)结尾的字符。
Sté*_*las 12
你3
来到这里的原因已经解释过了,但要补充一点关于主题中的问题:
根据该术语的严格 (POSIX) 定义,文本行始终以换行符结尾,因此计算换行符的数量与计算行数相同。
但有时,您会发现文件在最后一个换行符之后有数据(通常,非文本文件最有可能这样做)。例如,printf foo
(与实现相同echo -n foo
或echo 'foo\c'
取决于echo
实现)的输出不包含任何行,因为它foo
没有以换行符终止。
文本工具(该行为wc
是不是一个文本实用程序)是不确定的POSIX在这种情况下(一个文件,在比换行符以外的字符结尾不是一个文本文件)。有一些实用程序实现会将这些额外的字符视为额外的行,有些会忽略它们,有些可能会发出警告消息。在将其视为额外行的那些中,有些会在输出中添加缺少的换行符,有些则不会。
这意味着它wc -l
不一定会给您与sed -n '$='
orawk 'END{print NR}'
或 or 之类的结果相同的结果grep -c '^'
。
你的假设是正确的。wc -l
计算换行符 ( \n
)的数量。正如 XTian 所说,echo
在它打印的所有内容的末尾添加一个换行符,除非您告诉它不要-n
使用某些实现或通过包含\c
其他一些实现(符合 Unix 的实现)。
您可以通过管道检查这是否是正在发生的事情od -c
:
$ echo -e '\n\n' | od -c
0000000 \n \n \n
0000003
Run Code Online (Sandbox Code Playgroud)
所以wc -l
正确计算三行。