Linux上的文件中缺少EOL字符

use*_*330 1 linux bash shell sed

我有一个文件在最后一行的末尾没有EOL.当我从中读取的bash脚本没有处理最后一行时,我注意到了这一点.

我这样读了:

while read LINE
do
    ...
done <thefile
Run Code Online (Sandbox Code Playgroud)

该文件提供给我,因此在它进入我的系统之前我无能为力(Linux - OpenSuSE 10.2).我确实dos2unix在文件上运行,但这并不能解决丢失的EOL问题.

我见过涉及几个解决方案vied,但他们有点笨重,我希望有一个更简洁的解决方案,也许用sed,我可以从我的bash脚本中使用?

奇怪的是,当我vi在文件中做一个时:set list,我可以$在最后一行的末尾看到一个" ".因为我认为" $"代表了,所以我期待失踪\n.或者换行和行尾有什么区别?

Gor*_*son 5

这里有一个选项可以在文件末尾添加一个换行符(如果它还没有空行):

if [ -s "$thefile" ] && [ "$(tail -c1 "$thefile"; echo x)" != $'\nx' ]; then
    echo >>"$thefile"
fi
Run Code Online (Sandbox Code Playgroud)

或者,这是一种简单的方法来修改循环以处理最终换行后的任何内容:

while read LINE || [ -n "$LINE" ]
do
...
Run Code Online (Sandbox Code Playgroud)