#!/usr/bin/perl use strict; my $Usage = "Usage: $0 filename.txt > fixed.txt\n"; die $Usage unless ( @ARGV == 1 and -f $ARGV[0] ); $/ = ''; # empty string means blank lines mark end-of-record (cf. perldoc perlvar) my @pars = <>; # read all paragraphs into @pars my $sterm = qr/[.!?][)"']*/; # regex for end-of-sentence for ( my $i = 0; $i < $#pars; $i++ ) # skip last paragraph { next if ( $pars[$i] =~ /$sterm\s*$/ ); # get here when paragraph ends in mid-sentence my $j = $i + 1; # refer to next par for tail part of sentence ( my $tail ) = ( $pars[$j] =~ /(.*?$sterm)\s*/ ); $pars[$i] =~ s/\s*$/ $tail\n\n/; # add tail to current par $pars[$j] =~ s/\Q$tail\E\s*//; # remove it from next par } print @pars;