关于svn:如何在换行中检测文件结尾?

How to detect file ends in newline?

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

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


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

1
2
3
4
5
6
$ cat test_no_newline.txt
this file doesn't end in newline$

$ cat test_with_newline.txt
this file ends in newline
$

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

1
2
3
#!/bin/sh
c=`tail -c 1 $1`
if ["$c" !="" ]; then echo"no newline"; fi


甚至更简单:

1
2
#!/bin/sh
test"$(tail -c 1"$1")" && echo"no newline at eof: '$1'"

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

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


这是一个有用的bash函数:

1
2
3
function file_ends_with_newline() {
    [[ $(tail -c1"$1" | wc -l) -gt 0 ]]
}

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

1
2
3
4
5
if ! file_ends_with_newline myfile.txt
then
    echo"">> myfile.txt
fi
# continue with other stuff that assumes myfile.txt ends with a newline


为我工作:

1
2
tail -n 1 /path/to/newline_at_end.txt | wc --lines
# according to"man wc" : --lines - print the newline counts

因此,wc计算换行符的数量,这在我们的情况下是好的。
oneliner根据文件末尾的换行符打印0或1。


你可以使用这样的东西作为你的预提交脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
#! /usr/bin/perl

while (<>) {
    $last = $_;
}

if (! ($last =~ m/
$/)) {
    print STDERR"File doesn't end with \
!
"
;
    exit 1;
}

仅使用bash

1
2
x=`tail -n 1 your_textfile`
if ["$x" =="" ]; then echo"empty line"; fi

(注意正确复制空白!)

@grom:

tail does not return an empty line

该死的。我的测试文件没有在
上结束,而是在

上结束。显然vim无法创建不以
(?)结尾的文件。无论如何,只要"获取最后一个字节"选项有效,一切都很好。