2008-09-02 4 views

ответ

11

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

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

$ cat test_with_newline.txt 
this file ends in newline 
$ 

Хотя я нашел, что у хвоста есть последний байтовый вариант. Таким образом, я изменил свой сценарий, чтобы:

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

+1 Простой, эффективный, портативный. И не перл. :) – 2012-11-06 04:38:31

+1

Этот ответ не является оптимальным, потому что у меня нет понятия, о котором вы говорите Конрад. – oberlies 2014-12-23 15:40:48

+1

Не работает для меня. – Black 2016-01-22 09:36:23

-2

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

См. this example.

+1

Это не затрагивает актуальный вопрос, который является «Как вы можете обнаружить, что файл концов с новой линией? " – 2014-03-12 23:51:26

3

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

 
#! /usr/bin/perl 

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

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

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

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

(! Позаботьтесь, чтобы правильно скопировать пробельные)

@ %:

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

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

10

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

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

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

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

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

4

Вот полезная функция Баш:

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