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

StackOverflow https://stackoverflow.com/questions/38746

  •  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 (?).В любом случае, пока опция “получить последний байт” работает, все хорошо.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top