separating substitutions from an embedded perl in a ksh script

T

tazommers

I have a large ksh script which had an embedded perl invocation to do
a character replace... to fix a date in a large flat file. I know the
script is inefficient, but I wanted to just improve the logic a bit
rather than have to install new scripts etc. Anyway, the file has
records that if start with the character "5" may need to have the date
replaced at position 70 in the file.

Here is the code snipet I have that works, except for one thing...

CMD="perl -p -i -n -e "'"s/^5(.{68})$EFF_DATE/5\$1|$REP_DATE/g"'"
$FILE"
eval $CMD

I don't want that "|" character, but I need something to separate the
$1 for the perl group and the $REP_DATE from the ksh. The $REP_DATE
gets replaced in ksh with the string 080407 for instance, so how does
one separate the $1 group from the string 080407?
 
T

tazommers

The {}'s did it. Thanks! Much headbanging over. :)

I tried the second suggestion and it didn't actually replace
anything... but doesn't that syntax remove the first 69 characters
from the actual string? Yes, I'm a perl rookie btw.
 
J

John W. Krahn

David said:
On Fri, 4 Apr 2008 07:27:32 -0700 (PDT) in comp.lang.perl.misc,
(e-mail address removed) wrote,

Does writing $1 as ${1} do it?

But you are essentially replacing $1 with itself! That seems
gratuitous to me. The stuff before $EFF_DATE is just context and
should not participate in the replacement operation. Why not an
expression something more like:

s/(?<=^5.{68})$EFF_DATE/$REP_DATE/

Another way to do it:

/^5/ && substr( $_, 69 ) =~ s/^$EFF_DATE/$REP_DATE/

The /g should not be necessary, you only want one replacement per
line anyway.

I can't figure you would need both the -p and -n switches.

From perlrun.pod under the '-p' entry: "A -p overrides a -n switch." so
the -n switch in the OP's example is superfuous.



John
 
T

tazommers

I can't figure you would need both the -p and -n switches.
 From perlrun.pod under the '-p' entry: "A -p overrides a -n switch." so
the -n switch in the OP's example is superfuous.

Heh, I didn't even look at what the switches meant... am editing
someone else's code and trying to improve on effeciency... it's a slow
script
 
B

Ben Morrow

Quoth (e-mail address removed):
Heh, I didn't even look at what the switches meant... am editing
someone else's code and trying to improve on effeciency... it's a slow
script

If you can somehow arrange to run perl once, instead of lots of times,
you'll likely make it a good bit faster (assuming this perl invocation
is the bottleneck). Rewriting entirely in Perl is of course one way to
achieve this :).

Ben
 

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,768
Messages
2,569,574
Members
45,049
Latest member
Allen00Reed

Latest Threads

Top