using regexes as command line parameters

J

JMI

Hello

Short question, but maybe somebody knows how-to

Let's imagine your program accepts two command line arguments to perform
replaces in a string:
usage: myprogram -s "foo" -r "bar"
where s is the search regex and r the replace regex.

Everything works fine, even grouping with parenthesis, etc. As described in
detail in the cookbook.

But:
When I want to use a captured value in the replacement regex, it does
simply not work. Using all possible syntaxes ( as \$1, or \\$1...) only
leads to either an exmpty value in the replaced string, or a plain-text
"$1" text when too much is escaped.

The code looks like:

my $rx;
if ($case_sensitive) {
$rx = qr/$search_pattern/;
} else {
$rx = qr/$search_pattern/i;
}
print "Patching file:\t$origin\n" if ($debug_mode ||
$verbose_mode);
my $myfile = '';

print "Opening $origin\n" if $debug_mode;
open(OLD, "< $origin")
while (<OLD>) {
$myfile .= $_;
}
print "Closing $origin\n" if $debug_mode;
close(OLD)

open(NEW, "> $playground")
print "Replacing $search_pattern with $replace_pattern\n" if
$debug_mode;
$myfile =~ s/$rx/$replace_pattern/gs;
print NEW $myfile
close(NEW)

Hope it's the right place to find some people having had the same
problem,....

thanks and best regards
JM
 
P

Paul Lalli

JMI said:
Let's imagine your program accepts two command line arguments to perform
replaces in a string:
usage: myprogram -s "foo" -r "bar"
where s is the search regex and r the replace regex.

Everything works fine, even grouping with parenthesis, etc. As described in
detail in the cookbook.

But:
When I want to use a captured value in the replacement regex, it does
simply not work. Using all possible syntaxes ( as \$1, or \\$1...) only
leads to either an exmpty value in the replaced string, or a plain-text
"$1" text when too much is escaped.

Giving simply $1 makes the shell pass the shell's own $1 variable to
your script.
Giving \$1 passes the literal string '$1' to your script.

What you need to do is tell Perl to evaluate that literal string as
Perl:

perl -le'$_ = q/foo/; s/($ARGV[0])/$ARGV[1]/ee; print;' foo \$1

This is a trivial example, of course, but it does illustrate that perl
is correctly replacing 'foo' with the captured match (which also happens
to be 'foo').

For more info, look up the /e modifier in
perldoc perlretut
or
perldoc perlre

Paul Lalli
 
J

JMI

Worked ! Thanks a lot :)))


JMI said:
Let's imagine your program accepts two command line arguments to perform
replaces in a string:
usage: myprogram -s "foo" -r "bar"
where s is the search regex and r the replace regex.

Everything works fine, even grouping with parenthesis, etc. As described in
detail in the cookbook.

But:
When I want to use a captured value in the replacement regex, it does
simply not work. Using all possible syntaxes ( as \$1, or \\$1...) only
leads to either an exmpty value in the replaced string, or a plain-text
"$1" text when too much is escaped.

Giving simply $1 makes the shell pass the shell's own $1 variable to
your script.
Giving \$1 passes the literal string '$1' to your script.

What you need to do is tell Perl to evaluate that literal string as
Perl:

perl -le'$_ = q/foo/; s/($ARGV[0])/$ARGV[1]/ee; print;' foo \$1

This is a trivial example, of course, but it does illustrate that perl
is correctly replacing 'foo' with the captured match (which also happens
to be 'foo').

For more info, look up the /e modifier in
perldoc perlretut
or
perldoc perlre

Paul Lalli
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top