24

提交颠覆时你能修改文本文件吗? 格兰特建议我阻止提交。

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

4

10 回答 10

20

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

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

$ cat test_with_newline.txt
this file ends in newline
$

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

#!/bin/sh
c=`tail -c 1 $1`
if [ "$c" != "" ]; then
    echo "no newline"
fi
于 2008-09-02T23:35:22.377 回答
17

这是一个有用的 bash 函数:

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

你可以像这样使用它:

if ! file_ends_with_newline myfile.txt
then
    echo "" >> myfile.txt
fi
# continue with other stuff that assumes myfile.txt ends with a newline
于 2014-09-09T16:29:33.853 回答
15

或者更简单:

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

但是,如果您想要更强大的检查:

test "$(tail -c 1 "$1" | wc -l)" -eq 0 && echo "no newline at eof: '$1'"
于 2010-03-11T00:42:58.290 回答
3

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

#!/usr/bin/perl

而(<>){
    $最后 = $_;
}

if (! ($last =~ m/\n$/)) {
    print STDERR "文件不以 \\n!\n";
    1号出口;
}
于 2008-09-02T10:12:48.310 回答
3

仅使用bash

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

(注意正确复制空格!)

@格罗姆:

tail 不返回空行

该死。我的测试文件没有结束,\n而是在\n\n. 显然vim无法创建不以\n(?) 结尾的文件。无论如何,只要“获取最后一个字节”选项有效,一切都很好。

于 2008-09-02T10:30:45.507 回答
3

为我工作:

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

所以 wc 计算换行符的数量,这在我们的例子中很好。oneliner 根据文件末尾是否存在换行符打印 0 或 1。

于 2012-05-02T14:05:23.160 回答
2

一个完整的 Bash 解决方案,只有tail命令,也可以正确处理空文件。

#!/bin/bash
# Return 0 if file $1 exists and ending by end of line character,
# else return 1
[[ -s "$1" && -z "$(tail -c 1 "$1")" ]]
  • -s "$1"检查文件是否不为空
  • -z "$(tail -c 1 "$1")"检查其最后一个(现有)字符是否为行尾字符
  • 返回所有[[...]]条件表达式

您还可以定义此 Bash 函数以在脚本中使用它。

# Return 0 if file $1 exists and ending by end of line character,
# else return 1
check_ending_eol() {
    [[ -s "$1" && -z "$(tail -c 1 "$1")" ]]
}
于 2020-08-13T15:11:24.343 回答
0

read命令无法读取没有换行符的行。

if tail -c 1 "$1" | read -r line; then
  echo "newline"
fi

另一个答案。

if [ $(tail -c 1 "$1" | od -An -b) = 012 ]; then
  echo "newline"
fi
于 2020-03-29T08:16:21.127 回答
0

我正在对自己的答案进行更正。

以下应该适用于所有情况,没有失败:

nl=$(printf '\012')
nls=$(wc -l "${target_file}")
lastlinecount=${nls%% *}
lastlinecount=$((lastlinecount+1))
lastline=$(sed ${lastlinecount}' !d' "${target_file}")
if [ "${lastline}" = "${nl}" ]; then
    echo "${target_file} ends with a new line!"
else
    echo "${target_file} does NOT end with a new line!"
fi
于 2020-05-07T20:28:56.373 回答
0

您可以使用获取文件的最后一个字符tail -c 1

   my_file="/path/to/my/file"

   if [[ $(tail -c 1 "$my_file") != "" ]]; then
      echo "File doesn't end with a new line: $my_file"
   fi
于 2020-05-18T18:13:02.040 回答