Wednesday, February 9, 2011

How to detect file ends in newline?

Over at Can you modify text files when committing to subversion? Grant suggested that I block commits instead.

However I don't know how to check a file ends with a newline. How can you detect that the file ends with a newline?

  • You should be able to do it via a SVN pre-commit hook.

    See this example.

  • You could use something like this as your pre-commit script:

    #! /usr/bin/perl
    
    while (<>) {
        $last = $_;
    }
    
    if (! ($last =~ m/\n$/)) {
        print STDERR "File doesn't end with \\n!\n";
        exit 1;
    }
    
    From bstark
  • Using only bash:

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

    (Take care to copy the whitespaces correctly!)

    @grom:

    tail does not return an empty line

    Damn. My test file didn't end on \n but on \n\n. Apparently vim can't create files that don't end on \n (?). Anyway, as long as the “get last byte” option works, all's well.

  • @Konrad: tail does not return an empty line. I made a file that has some text that doesn't end in newline and a file that does. Here is the output from tail:

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

    Though I found that tail has get last byte option. So I modified your script to:

    #!/bin/sh
    c=`tail -c 1 $1`
    if [ "$c" != "" ]; then echo "no newline"; fi
    
    From grom
  • This answer worked well for me.

    From nwahmaet
  • Or even simpler:

    #!/bin/sh
    test `tail -c 1 $1` && echo "no newline at eof: $1"
    
    From felipec

0 comments:

Post a Comment