2008-09-02 27 views

答えて

11

@Konrad:テールは空行を返しません。私は改行で終わらないテキストと、改行で終わらないファイルを作成しました。テールからの出力は次のとおりです。

最後のバイトオプションがあることがわかりましたが、

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

しかし、あなたは、より堅牢なチェックをしたい場合:

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

+1シンプルで効果的で携帯に便利です。そして、perlではない。 :) –

+1

私はあなたが指しているコンラッドの手がかりがないので、この答えは最適ではありません。 – oberlies

+1

私のために働かない。 – Black

-2

あなたはSVNプリコミットフックを介してそれを行うことができるはずです。

this exampleを参照してください。

+1

これはどのようにファイルが終了することを検出することができます」で、実際の質問に対処しません。改行で? " –

3

あなたの前のコミットスクリプトとして、このようなものを使用することができます

 
#! /usr/bin/perl 

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

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

使用のみbash

​​

(!正しく空白をコピーするように注意してください)

@グロム:

テールは空の行を返しません。

Damn。テストファイルは\nではなく、\n\nで終了しました。明らかにvimは、\n(?)で終わらないファイルを作成することはできません。とにかく、 "最後のバイトを取得"オプションが機能する限り、すべてがうまくいきます。

10

それとももっと簡単:だから私はにスクリプトを修正

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

EOLと他のスペース文字の違いを判断できないため、信頼できません。 – akim

+0

@akimこれで修正されました。 – FelipeC

+0

これはまだ失敗します。最後の文字がnullバイトの場合 – tripleee

3

は私の仕事:

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

wcは改行chの数をカウントします私たちの場合は良いです。 onelinerは、ファイルの最後に改行の有無に応じて0または1のいずれかを表示します。ここで

4

は便利な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 
+1

これは受け入れられる回答でなければなりません。空のファイル、ヌルバイトで終わるファイル、および通常のファイルに対して正しく動作します。 'wc -l'へのパイプは魅力的ではありませんが、まさに正しいことです。ファイルの最後のバイトの改行数を数えます。それが1でなければ、ファイルは改行で終わらない。 – tripleee

関連する問題