#!/usr/bin/env perl use strict; use warnings; use Tie::File; my $file = 'pm_file_insert_re.file'; my $re = qr{ \A echo .* install_list \z }x; my $insert_line = 'echo ":app:new-name-here:" >> /mnt/install_list'; tie my @lines, 'Tie::File', $file or die "Can't tie $file: $!"; my $last_found = 0; @lines = reverse map { /$re/ && ! $last_found++ ? ($insert_line, $_) : $_ } reverse @lines; untie @lines; #### ken@ganymede: ~/tmp $ cat pm_file_insert_re.file early text echo ":os:5.7:" >> /mnt/install_list middle text echo ":app:name-here:" >> /mnt/install_list later text ken@ganymede: ~/tmp $ pm_file_insert_re.pl ken@ganymede: ~/tmp $ cat pm_file_insert_re.file early text echo ":os:5.7:" >> /mnt/install_list middle text echo ":app:name-here:" >> /mnt/install_list echo ":app:new-name-here:" >> /mnt/install_list later text ken@ganymede: ~/tmp $