Shell脚本:如何在Windows上读取不以换行符结尾的文本文件

时间:2012-02-23 06:16:23

标签: bash shell

以下程序读取文件,它打算将所有值(每行)存储到变量中,但不存储最后一行。为什么呢?

file.txt

   1
   2
   .
   .
   .
   n

代码

 FileName=file.txt

if test -f $FileName         # Check if the file exists
    then
        while read -r line
        do    
            fileNamesListStr="$fileNamesListStr $line"

        done < $FileName
    fi

  echo "$fileNamesListStr"  // 1 2 3 ..... n-1 (but it should print up to n.)

4 个答案:

答案 0 :(得分:4)

为什么不一次阅读整个文件而不是逐行阅读?

[ -f $FileName ] && fileNameListStr=$( tr '\n' ' ' < $FileName )

答案 1 :(得分:3)

一个可能的原因是在最后一行n之后错过了换行符。

使用以下命令进行检查:

tail -1 file.txt

以下修正:

echo >> file.txt

如果你真的需要保留最后一行而不是换行符,我在这里重新组织了while循环。

#!/bin/bash
FileName=0
if test -f $FileName ; then
    while [ 1 ] ; do    
        read -r line
        if [ -z $line ] ; then
            break
        fi
        fileNamesListStr="$fileNamesListStr $line"
    done < $FileName
fi
echo "$fileNamesListStr"

答案 2 :(得分:1)

问题是当文件没有以换行符结尾时,read返回非零值并且循环不会继续。 read命令仍然会读取数据,但不会处理循环。这意味着您需要在循环外进行进一步处理。您可能还需要一个数组而不是空格分隔的字符串。

文件名= file.txt的

if test -f $FileName         # Check if the file exists
    then
        while read -r line
        do    
            fileNamesListArr+=("$line")

        done < $FileName

        [[ -n $line ]] && fileNamesListArr+=("$line")
fi

echo "${fileNameListArr[@]}"

请参阅“我的文本文件已损坏!它们缺少最终的换行符!”本文的部分: http://mywiki.wooledge.org/BashFAQ/001

答案 3 :(得分:0)

作为一种解决方法,在从文本文件中读取之前,可以将换行符附加到文件中。

echo "\n" >> $file_path

这将确保读取文件中先前存在的所有行。现在可以逐行读取文件。