#!/usr/bin/perl -w use strict; use Fcntl ':flock'; use IO::Seekable; die "usage: $0 line files..." if @ARGV < 2; my ($line, @files) = @ARGV; foreach my $f (@files) { open(F, "+<$f") or die "cannot open $f: $!"; flock(F, LOCK_EX) or die "cannot lock $f: $!"; chomp (my @lines = ); my $seen = 0; my @out; foreach (@lines) { push @out, $_ unless $_ eq $line and not $seen++; } die "line $line not found in $f" if not $seen; truncate F, 0 or die "cannot truncate $f: $!"; seek F, 0, SEEK_SET or die "cannot seek on $f: $!"; foreach (@out) { print F "$_\n" or die "cannot write to $f: $!"; } close F or die "cannot close $_: $!"; }