Как определить конец файла в новой строке?
В Можете ли вы изменить текстовые файлы при совершении подрывной деятельности? Грант предложил, чтобы я блокировал коммит вместо.
Однако я не знаю, как проверить, что файл заканчивается новой строкой. Как вы можете обнаружить, что файл заканчивается символом новой строки?
Ответы
Ответ 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 до фиксации.
Смотрите этот пример.