2008-09-02 8 views

Trả lời

11

@Konrad: đuôi không trả lại dòng trống. Tôi đã tạo một tệp có một số văn bản không kết thúc bằng dòng mới và tệp. Đây là đầu ra từ đuôi:

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

$ cat test_with_newline.txt 
this file ends in newline 
$ 

Mặc dù tôi thấy rằng đuôi đó có tùy chọn byte cuối cùng. Vì vậy, tôi sửa đổi kịch bản của bạn:

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

+1 Đơn giản, hiệu quả, di động. Và không phải perl. :) –

+1

Câu trả lời này không phải là tối ưu bởi vì tôi không có đầu mối mà Konrad bạn đang đề cập đến. – oberlies

+1

Không làm việc cho tôi. – Black

-2

Bạn sẽ có thể thực hiện điều đó thông qua móc trước SVN.

Xem this example.

+1

này không đề cập đến câu hỏi thực tế, đó là "Làm thế nào bạn có thể phát hiện rằng tập tin đầu với một dòng mới? " –

3

Bạn có thể sử dụng một cái gì đó như thế này như trước cam kết của bạn kịch bản:

 
#! /usr/bin/perl 

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

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

Chỉ sử dụng bash:

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

(! Hãy cẩn thận để sao chép các khoảng trắng chính xác)

@ grom:

đuôi không trả lại dòng trống

Thiệt hại. Tệp kiểm tra của tôi không kết thúc vào ngày \n nhưng trên \n\n. Rõ ràng vim không thể tạo tệp không kết thúc vào \n (?). Dù sao, miễn là tùy chọn "có được byte cuối cùng" hoạt động, tất cả đều tốt.

10

Hoặc thậm chí đơn giản hơn:

#!/bin/sh 
test "$(tail -c 1 "$1")" && echo "no newline at eof: '$1'" 

Nhưng nếu bạn muốn kiểm tra mạnh mẽ hơn:

test "$(tail -c 1 "$1" | wc -l)" -eq 0 && echo "no newline at eof: '$1'" 
+0

Không đáng tin cậy, vì nó không thể cho biết sự khác biệt giữa EOL và bất kỳ ký tự khoảng trắng nào khác. – akim

+0

@akim Hiện đã được sửa. – FelipeC

+0

Điều này vẫn không thành công, ví dụ: nếu ký tự cuối cùng là một byte null. – tripleee

3

Làm việc cho tôi:

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

Vì vậy, số lượng wc số lượng dòng mới ch ars, đó là tốt trong trường hợp của chúng tôi. Bản in trên máy in là 0 hoặc 1 theo sự hiện diện của dòng mới ở cuối tệp.

4

Đây là một chức năng bash hữu ích:

function file_ends_with_newline() { 
    [[ $(tail -c1 "$1" | wc -l) -gt 0 ]] 
} 

Bạn có thể sử dụng nó như:

if ! file_ends_with_newline myfile.txt 
then 
    echo "" >> myfile.txt 
fi 
# continue with other stuff that assumes myfile.txt ends with a newline 
+1

Đây phải là câu trả lời được chấp nhận; nó hoạt động chính xác cho các tệp rỗng, các tệp kết thúc bằng một byte rỗng và các tệp thông thường. Các đường ống để 'wc -l' là loại hấp dẫn nhưng nó không chính xác những điều đúng - nó đếm số lượng các dòng mới trong byte cuối cùng của tập tin. Nếu nó không phải là một, tập tin không kết thúc bằng một dòng mới. – tripleee