The simple way to delete the last line of a file is: perl -i -ne 'print unless eof' file
The following program is an alternative approach which is faster for large files. It reads from the end of the file in buffer sized chunks until it encounters the last line and then truncates the file to delete it. It also works with Windows files.
Usage: perl truncate.pl file See File::ReadBackwards for a more rigorous treatment of this type of problem.
#!/usr/bin/perl -w # Simple program to delete the last line of a file. # Reads from the end of the file for effeciency # # reverse('©'), MMII, John McNamara, jmcnamara@cpan.org use strict; my $filename = shift or die "Usage: $0 file\n"; my $file_size; my $buff_size = 256; my $eol = "\n"; my $eol_size = length $eol; my $read_num = 1; my $text = ''; # Open the file in read/write mode open FILE, "+<$filename" or die "Couldn't open $filename: $!"; $file_size = -s $filename; binmode FILE; # Change the buffer size to equal the file size if the file # is smaller than the buffer. $buff_size = $file_size if $buff_size > $file_size; # Read backwards through the file until we find an eol while (($buff_size <= $file_size) and ($file_size > 0)) { # Rewind from the end of the file seek FILE, -$buff_size *$read_num, 2; # Store the current position my $current = tell FILE; # Ignore possible eol as last char on first read if ($read_num == 1) { read FILE, $text, $buff_size -$eol_size; } else { read FILE, $text, $buff_size; } # Find the last eol and truncate the file after it if ((my $offset = rindex $text, $eol) != -1) { truncate FILE, $current +$offset +$eol_size; last; } elsif ($current <= $buff_size) { # If the current file position is within the buffer # size and we haven't found an eol then there is only # one line in the file. So we truncate the whole file. truncate FILE, 0; last; } # If eol not found read backwards another time $read_num++; $file_size -= $buff_size; }
In reply to Delete the last line of a file by jmcnamara
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |