web*_*web 0 linux text-processing wc
我一直在wc -l用来检查我的文件中存在的行数。它总是运行良好,但这次不行。
我有 120 个大文件,每个文件应该至少有两行。我刚刚对这些文件进行了一些文本编辑工作,以删除和添加新行。我试图wc -l *像往常一样使用来检查最终的行数。输出显示大多数文件只有一行。
我打开了其中一个文件(从命令的结果中显示它只有一行),vim我可以看到它正好有 2 行。退出vim并使用 再次检查wc -l,该文件的行数然后显示为 2。
有人知道这里发生了什么吗?我该如何解决这个问题而不是打开所有 120 个文件vim?
PS:我的文件的最后一行不是空的。
通用的 gnu 实现wc说
'wc' 计算
每个给定 FILE 或标准输入中的字节、字符、空格分隔的单词和换行符的数量,如果没有给出,或者对于 '-' 的 FILE。
因此,如果文件中没有最后的换行符,则wc输出的“行”部分将比预期少一个。例如下面将输出 1
printf 'hello\nworld' | wc -l
Run Code Online (Sandbox Code Playgroud)
OP 在评论中确认 vim 报告缺少最终换行符。如果已知所有文件都有这个问题,一个简单的解决方法是
for f in *
do
echo >> "$f"
done
Run Code Online (Sandbox Code Playgroud)
为每个文件附加一个换行符。
如果所有文件都缺少一个,则有条件地将换行符添加到所有文件的末尾的一种方法是使用 sed。
sed -s -i '$s/$/\n/;P;d' *
Run Code Online (Sandbox Code Playgroud)
使用一些 gnu 扩展名,-s分别处理每个文件,-i进行就地编辑,并允许\n表示换行符。sed 程序本身说在每个文件的最后一行添加一个换行符,并为每一行打印到第一个换行符并移动到下一行。