Bash Shell脚本:如何在Windows上读取不以换行符结尾的文本文件
下面的程序读取一个文件,它打算将所有值(每行)存储到一个变量中,但不存储最后一行。为什么? file.txt: 代码:Bash Shell脚本:如何在Windows上读取不以换行符结尾的文本文件,bash,shell,Bash,Shell,下面的程序读取一个文件,它打算将所有值(每行)存储到一个变量中,但不存储最后一行。为什么? file.txt: 代码: FileName=file.txt 如果测试-f$FileName#检查文件是否存在 然后 而read-r行 做 fileNamesListStr=“$fileNamesListStr$line” 完成file.txt。谢谢jordanm。在这两种情况下都可以工作,文件是否以新行结尾。非常感谢您的时间和您提供的解决方案。在内存空间和访问存储数据方面,哪一个是有效的空格分隔字符串
FileName=file.txt
如果测试-f$FileName#检查文件是否存在
然后
而read-r行
做
fileNamesListStr=“$fileNamesListStr$line”
完成<$FileName
fi
回显“$FileNameListStr”//1 2 3。。。。。n-1(但应打印到n)
一个可能的原因是在最后一行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"
#/bin/bash
文件名=0
如果测试-f$FileName;然后
而[1];做
read-r行
如果[-z$行];然后
打破
fi
fileNamesListStr=“$fileNamesListStr$line”
完成<$FileName
fi
回显“$FileNameListStr”
与其逐行读取,为什么不一次读取整个文件
[ -f $FileName ] && fileNameListStr=$( tr '\n' ' ' < $FileName )
[-f$FileName]&&fileNameListStr=$(tr'\n'<$FileName)
问题在于,当文件没有换行结束时,read返回非零,循环不会继续。read命令仍将读取数据,但不会处理循环。这意味着您需要在循环之外进行进一步的处理。您可能还希望使用数组而不是空格分隔的字符串
FileName=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[@]}"
如果测试-f$FileName#检查文件是否存在
然后
而read-r行
做
fileNamesListArr+=(“$line”)
完成<$FileName
[[-n$line]&&fileNamesListArr+=(“$line”)
fi
回显“${fileNameListArr[@]}”
请参阅本文的“我的文本文件已损坏!它们缺少最后的换行符!”部分:
作为一种解决方法,在读取文本文件之前,可以在文件中添加换行符
echo "\n" >> $file_path
这将确保读取文件中以前的所有行。现在可以逐行读取文件。您的文件是否以新行结尾?@jackrabbit:不。实际上大多数客户端都不知道,他们编写文件时没有以新行结尾。因此,我正在寻找这样的解决方案,这应该在两种情况下都有效。谢谢你的时间。如果我使用
tail-1 file.txt
则它返回最后一行(n
)文件是否以新行结尾,echo>>file.txt
在文件末尾添加一个新的空行,无论文件是否以新行结尾。因此,我认为它在我的情况下没有多大用处,我想先检查一下,文件是否以新行结尾不做任何事情。elseecho>>file.txt
。谢谢jordanm。在这两种情况下都可以工作,文件是否以新行结尾。非常感谢您的时间和您提供的解决方案。在内存空间和访问存储数据方面,哪一个是有效的空格分隔字符串与数组字符串
。@user1010399我的解决方案的好处是它可以处理包含空格的文件中的文件名,而其他的则不能。我不确定RAM的差异,但很可能可以忽略不计。如果你想减少一点内存使用和速度,那么你使用了错误的语言。+100!谢谢乔丹。基本上,我是一名java程序员,对shell脚本没有太多想法。再次感谢。非常出色和高效:)+100另外,如果文件丢失,我想发出通知???@user1010399,然后使用带有else
子句的if
语句。
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[@]}"
echo "\n" >> $file_path