#!/usr/bin/perl # # Clean a text file of stealth whitespace # use bytes; $name = 'cleanfile'; foreach $f ( @ARGV ) { print STDERR "$name: $f\n"; if (! -f $f) { print STDERR "$f: not a file\n"; next; } if (!open(FILE, '+<', $f)) { print STDERR "$name: Cannot open file: $f: $!\n"; next; } binmode FILE; # First, verify that it is not a binary file $is_binary = 0; while (read(FILE, $data, 65536) > 0) { if ($data =~ /\0/) { $is_binary = 1; last; } } if ($is_binary) { print STDERR "$name: $f: binary file\n"; next; } seek(FILE, 0, 0); @blanks = (); @lines = (); while ( defined($line = ) ) { $line =~ s/[ \t\r\n]*$/\n/; if ( $line eq "\n" ) { push(@blanks, $line); } else { push(@lines, @blanks); push(@lines, $line); @blanks = (); } } # Any blanks at the end of the file are discarded seek(FILE, 0, 0); print FILE @lines; if ( !defined($where = tell(FILE)) || !truncate(FILE, $where) ) { die "$name: Failed to truncate modified file: $f: $!\n"; } close(FILE); }