【发布时间】:2011-08-20 19:55:57
【问题描述】:
我有一堆不完整的文件:最后一行缺少 EOL 字符。
使用任何工具(也许是 awk?)添加换行符的最简单方法是什么?
【问题讨论】:
标签: bash awk newline text-files
我有一堆不完整的文件:最后一行缺少 EOL 字符。
使用任何工具(也许是 awk?)添加换行符的最简单方法是什么?
【问题讨论】:
标签: bash awk newline text-files
在文件末尾添加换行符:
echo >>file
在当前目录中每个文件的末尾添加一行:
for x in *; do echo >>"$x"; done
如果您事先不知道每个文件是否以换行符结尾,请先测试最后一个字符。 tail -c 1 打印文件的最后一个字符。由于命令替换会截断任何最后的换行符,如果文件为空或以换行符结尾,$(tail -c 1 <file) 为空,如果文件以非换行符结尾,则为非空。
for x in *; do if [ -n "$(tail -c 1 <"$x")" ]; then echo >>"$x"; fi; done
【讨论】:
tail -c 1 不返回任何内容?
tail -c 1 总是返回最后一个字符,无论它是否是换行符。它是 shell 的命令替换构造 $(…) 去除最后的换行符。所以如果tail -c 1 只输出一个非换行符,你就会得到那个字符。如果tail -c 1 只输出一个换行符,或者什么都不输出(空文件),你什么也得不到。
if [ -s "$x" -a -n "$(tail -c 1 <"$x")" ]; then...
$(tail -c 1 <"$x") 是空文件。
Vim 非常适合,因为如果你不在binary 模式下打开文件,它会自动以检测到的行结尾结束文件。
所以:
vim file -c 'wq'
应该可以工作,无论您的文件是 Unix、Windows 还是 Mac 行尾样式。
【讨论】:
echo >> filename
在大量使用之前尝试一下:)
【讨论】: