FAQ
On 2/25/09 Wed Feb 25, 2009 5:02 PM, "lemba" <lemba@sbcglobal.net>
scribbled:
Hi All,

I'm trying to replace some text in file. Below is my script. It
basically makes a copy of line with changes. How can I replace pattern
in the uxix sed way?
I don't use sed, but you can use Perl "one-liners" to emulate sed. See
'perldoc perlrun' and the -p, -I, and -e options. Example:

perl -p -i -e 's/(starbucks.*)restaurant/$1CAFE/i' file.txt

Although for more control, you might still want to write a full script. Even
in a full script, you can use the $^I variable to enable in-place editing
using the <> file input operator, if desired, emulating the -I command-line
option.
use strict;
use warnings;
use Cwd;
use Win32;
use File::Path;
use File::Find;
use File::Basename;

@ARGV = Win32::GetCwd() unless @ARGV;

my @source;
find (\&findSource, $ARGV[0]);
You don't seem to be showing us your full script (findSource is missing). I
will assume that findSource puts file names to modify in the @source array.
foreach ( @source )
{
open SOURCE, "+<", $_ or die "Error: $!\n";
You might want to add the file name ($_) to your error message.

open SOURCE, "+<", $_ or die "Error in file $_: $!\n";
my @file = <SOURCE>;
@file is not a good variable name for an array that holds lines in a file. I
would suggest @lines might be better.
seek SOURCE,0,0;

foreach my $file (@file)
Maybe $line is a better name than $file here?
{
if ( $file =~ /STARBUCKS.*RESTAURANT/i )
{
$file =~ s/RESTAURANT/CAFE/g;
print SOURCE $file;
You want to print $file if it doesn't match, so move this print statement
below the if statement (but see below for a solution that doesn't involve an
if statement.)
}
}
There is no need to first test if $file matches, then substitute if it does.
The s/// operator will not substitute unless there is a match. You just have
to save the data you are matching or use look-ahead, look-behind constructs.
I find it easier to save, as I can never remember the syntax for
look-arounds:

$file =~ s/(STARBUCKS.*)RESTAURANT/$1CAFE/i;
print SOURCE $file;

close SOURCE;
}

Example of my original file:
STARBUCKS|RESTAURANT
JACK IN THE BOX|RESTAURANT
STARBUCKS|RESTAURANT
MC DONALDS|RESTAURANT

after replacement it should be like this:
STARBUCKS|CAFE
JACK IN THE BOX|RESTAURANT
STARBUCKS|CAFE
MC DONALDS|RESTAURANT

Thanks in advance,
Vladimir

Search Discussions

Discussion Posts

Previous

Related Discussions

Discussion Navigation
viewthread | post
posts ‹ prev | 2 of 2 | next ›
Discussion Overview
groupbeginners @
categoriesperl
postedFeb 26, '09 at 1:02a
activeFeb 26, '09 at 2:05a
posts2
users2
websiteperl.org

2 users in discussion

Jim Gibson: 1 post Lemba: 1 post

People

Translate

site design / logo © 2022 Grokbase