replace some words in a file with a perl script.

W

Wang Penghui

Hi all:

I am a newbie with perl. I have met a pazzle now.
I have a file with thousands of lines. And which line has four fields.
They are separated by a "\t".
Such as:
================file==================
line1first line1second line1third line1fourth
line2first line2second line2third line2fourth
line3first line3second line3third line3fourth
........
Now i want to replace some words in the fourth field. While the first
three fields stay here as before.
I have writen a little code about it. Here is it:

open (ZH,"file") || die "could not open filename!"
@instead=split(/\t/,<ZH>);
close (ZH) || die "could not close filename!"
open (ZH,">file") || die "could not open filename!"
foreach (@instead) {
s/original/changed/g
print ZH $_;
};
close (ZH) || die "could not close filename!"

This script would replace all the words matched in each field. But it's
not what i want to get.
Anyone could pick me up?
Thanks in advance!

Wang Penghui
 
T

Tad McClellan

Wang Penghui said:
I am a newbie with perl. I have met a pazzle now.


Your Question is Asked Frequently.

How do I change one line in a file/
delete a line in a file/
insert a line in the middle of a file/
append to the beginning of a file?

I have a file with thousands of lines.


But your code only reads ONE of those lines!


@instead=split(/\t/,<ZH>);


This is the only input in your code, it reads one line.

open (ZH,">file") || die "could not open filename!"


So this will stomp over the file contents with one line.

foreach (@instead) {
s/original/changed/g
^^
^^

Syntax error.

It is pretty rude of you to not post Real Perl Code.

Have you seen the Posting Guidelines that are posted here frequently?

print ZH $_;
};

This script would replace all the words matched in each field.


Have you run that program?

Didn't you notice the one-line thing already?

But it's
not what i want to get.
Anyone could pick me up?


If you want to s/// on only one element in @instead then don't
loop over ALL of the elements of @instead.

Replace the foreach with:

$instead[3] =~ s/original/changed/g;
print ZH $_ foreach @instead; # but don't you want to put the
# tab chars back in?
 

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,579
Members
45,053
Latest member
BrodieSola

Latest Threads

Top