We help IT Professionals succeed at work.

how to subsitutes strings with variable values in perl

ommer
ommer asked
on
Medium Priority
250 Views
Last Modified: 2012-05-07
Hi, all perl experts,
I need your help on this regular expression that will replace the page numbers with a newer set of numbers.

Here is part of my input file
------ ---- ----
page1
thehe
page2
the
junk
page1

and next is the output file I want to produce.
------ ---- ----
page3
thehe
page4
the
junk
page5

The code I had could only replace the string "page". I need syntax helps on
1) find the page AND the number comes after them,
2) replace them with "page" NewNo which is the $Page_Seed plus 1 , and,
3) a machanisim to loop through each of this "page" label.

Thanks!

my ($Page_Seed)=3;
while (<$in>)
{
s/\b(page)\b/pageNewNo/g;
print $out $_;
}

Open in new window

Comment
Watch Question

Top Expert 2009

Commented:
Something like this?
#!/usr/bin/perl
 
my $s = "page1";
 
$s =~ s/^page(\d+)/sprintf "page%d", $1+1/e;
 
print "$s\n";

Open in new window

Author

Commented:
your code made my screen printed
page2
page3
...
page28
It was driven by the number of lines I had from my input file. Why it is not by the number of "page"s found?
Top Expert 2009

Commented:
Not sure. This code below prints as I expect it:

page2
page2
page6

Post your code?
#!/usr/bin/perl
 
my $s = "page1\npage1\npage5";
 
$s =~ s/^page(\d+)/sprintf "page%d", $1+1/gme;
 
print "$s\n";

Open in new window

Author

Commented:
my ($Page_Seed)=3;
my $s="page1";
open my $in, '<', "file.txt";
open my $out, '>', "fileNew.txt";
while (<$in>)
{
$s =~ s/^page(\d+)/sprintf "page%d", $1+1/e;
print "$s\n";
#print $out $_;
}
ozo
CERTIFIED EXPERT
Most Valuable Expert 2014
Top Expert 2015

Commented:
#is this what you are trying to do?
s/page(\d+)/page@{[++$pageseed]}/g;

Author

Commented:
Yes, #is what I want to see, i.e. all contents from in file with all "page1, page2, page1, ...pageN" lines replaced with "page3, page4, page5, ...pageN+PageSeed" lines.
Top Expert 2009

Commented:
IN that case you can just use a single variable:

$pageSeed = 3;

$s =~ s/^page(\d+)/sprintf "page%d", ++$pageSeed/gme;


That work?

Author

Commented:

with that and
print $out $s;

I got
page6page7page8page9...page32 in my out file
bty, my page seed this time is 5.

my original 3 steps
1) find the page AND the number comes after them,
page(\d+)  <----------- took care of that
2) replace them with "page" NewNo which is the $Page_Seed plus 1 , and,
sprintf "page%d", ++$pageSeed/gme <------OK??
3) a machanisim to loop through each of this "page" label.
stuck on this part? :(

ozo
CERTIFIED EXPERT
Most Valuable Expert 2014
Top Expert 2015

Commented:
#if "page" must occur at the beginning of  a line
s/^(page)\d+/$1.$pageseed++/gme;
CERTIFIED EXPERT
Most Valuable Expert 2014
Top Expert 2015
Commented:
Unlock this solution and get a sample of our free trial.
(No credit card required)
UNLOCK SOLUTION

Author

Commented:
this is very close!
I have a minor detail.
On my out file there is a white space between page and the page number. I don't quite understand this $1.$var syntax, so when I tried to add a space there, it did not like it.
thanks!
ozo
CERTIFIED EXPERT
Most Valuable Expert 2014
Top Expert 2015

Commented:
#to add a space where there was none before
s/\b(page)\d+/"$1 ".$pageseed++/ge;

#to keep existing spaces from the input
s/\b(page\s*)\d+/$1.$pageseed++/ge;

Author

Commented:
thanks!
Top Expert 2009

Commented:
Thanks for your time. ;)
Unlock the solution to this question.
Thanks for using Experts Exchange.

Please provide your email to receive a sample view!

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.