in reply to Properly newline terminate a bunch of files on Unix

From the command line, $ perl -pi -e'tr/\015//d' *.{pl,pm,pod,txt} or whatever shell glob you want to pick the files. I think that one's in the FAQs.

Update: Ah, sorry, I misread,

#!/usr/bin/perl for (@ARGV) { open my $fh, '+>>', $_ or warn $! and next; seek $fh, 2, -1; if (<$fh> ne "\n") { seek $fh, 2, 0 # seek unneeded on many platforms and print $fh "\n"; print $_, $/; } }
(untested)

After Compline,
Zaxo

Replies are listed 'Best First'.
Re: Re: Properly newline terminate a bunch of files on Unix
by eyepopslikeamosquito (Archbishop) on Jul 11, 2003 at 02:24 UTC

    No, I don't want to delete CRs; I just want to make sure that the last line is properly terminated with a LF. Also, I don't want to change a file unless it needs changing and I want to know which files were actually changed.

    Update.

    Ooooh, I like that '+>>' trick. Didn't think of that. Here is a recursive version:

    #!/bin/sh perl -MFile::Find -e'find({no_chdir=>1,wanted=>sub{/\.c(?:pp)?$/||/\.h +$/ or return;open(Z,"+>>",$_) or warn("$_: $!\n"),return;seek(Z,-1,2) +;<Z>eq"\n" or print(Z "\n"),warn("Fixed $_\n");close(Z)}},$ENV{DEV})'