如何检测换行中的文件结尾?

gro*_*rom 16 svn bash text-files

提交subversion时你可以修改文本文件吗? 格兰特建议我阻止提交.

但是我不知道如何检查文件以换行符结尾.如何检测文件以换行符结尾?

gro*_*rom 16

@Konrad:tail不返回空行.我创建了一个文件,其中包含一些不以换行符结尾的文本和一个文件.这是尾部的输出:

$ cat test_no_newline.txt
this file doesn't end in newline$ 

$ cat test_with_newline.txt
this file ends in newline
$
Run Code Online (Sandbox Code Playgroud)

虽然我发现尾部有最后一个字节选项.所以我将你的脚本修改为:

#!/bin/sh
c=`tail -c 1 $1`
if [ "$c" != "" ]; then echo "no newline"; fi
Run Code Online (Sandbox Code Playgroud)

  • +1简单,有效,便携.而不是perl.:) (3认同)
  • 这个答案不是最佳的,因为我不知道您指的是哪个康拉德。 (2认同)
  • 如果最后一个字节为空字节,这也将失败。您不能在命令替换中区分“空”和“以换行符结尾”,这会修剪最终的换行符。 (2认同)

Fel*_*peC 14

甚至更简单:

#!/bin/sh
test "$(tail -c 1 "$1")" && echo "no newline at eof: '$1'"
Run Code Online (Sandbox Code Playgroud)

但如果你想要更健壮的检查:

test "$(tail -c 1 "$1" | wc -l)" -eq 0 && echo "no newline at eof: '$1'"
Run Code Online (Sandbox Code Playgroud)

  • 精细。一个额外的检查。 (2认同)

Ste*_*let 7

这是一个有用的bash函数:

function file_ends_with_newline() {
    [[ $(tail -c1 "$1" | wc -l) -gt 0 ]]
}
Run Code Online (Sandbox Code Playgroud)

您可以像以下一样使用它:

if ! file_ends_with_newline myfile.txt
then
    echo "" >> myfile.txt
fi
# continue with other stuff that assumes myfile.txt ends with a newline
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案;它适用于空文件、以空字节结尾的文件和常规文件。到 `wc -l` 的管道有点不吸引人,但它做的完全正确——它计算文件最后一个字节中的换行数。如果不是,则文件不会以换行符结尾。 (2认同)