Как определить, что файл заканчивается на новой строке?
-
09-06-2019 - |
Вопрос
Вон там , в Можете ли вы изменять текстовые файлы при переходе на subversion? Грант предложил мне вместо этого блокировать коммиты.
Однако я не знаю, как проверить, заканчивается ли файл новой строкой.Как вы можете определить, что файл заканчивается новой строкой?
Решение
@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
Другие советы
Или даже проще:
#!/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'"
Вот полезная функция 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
Вы можете использовать что-то вроде этого в качестве сценария предварительной фиксации:
#! /usr/bin/perl while (<>) { $last =Вы можете использовать что-то вроде этого в качестве сценария предварительной фиксации:
<*>; } if (! ($last =~ m/\n$/)) { print STDERR "File doesn't end with \\n!\n"; exit 1; }
Работал для меня:
tail -n 1 /path/to/newline_at_end.txt | wc --lines
# according to "man wc" : --lines - print the newline counts
Итак, wc считает количество символов новой строки, что хорошо в нашем случае. Oneliner печатает 0 или 1 в зависимости от наличия новой строки в конце файла.
Используя только bash
:
x=`tail -n 1 your_textfile`
if [ "$x" == "" ]; then echo "empty line"; fi
(Позаботьтесь о том, чтобы правильно скопировать пробелы!)
@grom:
tail не возвращает пустую строку
Черт.Мой тестовый файл не заканчивался на \n
но на \n\n
.Очевидно vim
не удается создать файлы, которые не заканчиваются на \n
(?).В любом случае, пока опция “получить последний байт” работает, все хорошо.