Как определить конец файла в новой строке? - PullRequest
15 голосов
/ 02 сентября 2008

Больше на Можете ли вы изменить текстовые файлы при фиксации в subversion? Грант предложил вместо этого заблокировать коммит.

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

Ответы [ 6 ]

16 голосов
/ 03 сентября 2008

@ 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
12 голосов
/ 11 марта 2010

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

#!/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'"
6 голосов
/ 09 сентября 2014

Вот полезная функция 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
3 голосов
/ 02 мая 2012

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

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

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

3 голосов
/ 02 сентября 2008

Вы можете использовать что-то вроде этого в качестве сценария предварительной фиксации:

#! /usr/bin/perl

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

if (! ($last =~ m/\n$/)) {
    print STDERR "File doesn't end with \\n!\n";
    exit 1;
}
2 голосов
/ 02 сентября 2008

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

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

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

@ Grom:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...