Как определить конец файла в новой строке?

В Можете ли вы изменить текстовые файлы при совершении подрывной деятельности? Грант предложил, чтобы я блокировал коммит вместо.

Однако я не знаю, как проверить, что файл заканчивается новой строкой. Как вы можете обнаружить, что файл заканчивается символом новой строки?

Ответ 1

@Konrad: tail не возвращает пустую строку. Я создал файл с текстом, который не заканчивается символом новой строки и файлом. Вот вывод из хвоста:

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

$ cat test_with_newline.txt
this file ends in newline
$

Хотя я обнаружил, что у хвоста есть последний байтовый вариант. Поэтому я изменил ваш script на:

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

Ответ 2

Или даже проще:

#!/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'"

Ответ 3

Вот полезная функция 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

Ответ 4

Вы можете использовать что-то вроде этого как pre-commit script:

#! /usr/bin/perl

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

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

Ответ 5

Работал для меня:

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

Итак, wc подсчитывает количество символов новой строки, что хорошо в нашем случае. Oneliner печатает либо 0, либо 1 в соответствии с наличием новой строки в конце файла.

Ответ 6

Использование только bash:

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

(Будьте осторожны, чтобы скопировать пробелы правильно!)

@grom:

tail не возвращает пустую строку

Блин. Мой тестовый файл не закончился на \n, а на \n\n. По-видимому vim не может создавать файлы, которые не заканчиваются на \n (?). Во всяком случае, до тех пор, пока опция "получить последний байт" работает, все хорошо.

Ответ 7

Вы можете сделать это с помощью привязки SVN до фиксации.

Смотрите этот пример.