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; } |
仅使用
1 2 | x=`tail -n 1 your_textfile` if ["$x" =="" ]; then echo"empty line"; fi |
(注意正确复制空白!)
@grom:
tail does not return an empty line
该死的。我的测试文件没有在
上结束。显然