Solved

Using sed to change a string in an entire directory

Posted on 2000-02-23
16
226 Views
Last Modified: 2010-04-21
OK....lets say I have a directory on a UNIX server.
I want to change everyone of those files in the same
way.  IE, search through every file in the directory for
red and change it to blue.

How do I do this.  As I've seen sed can only be used on
one file at a time.

I tried:

sed 's/red/blue/g' *.*

and that actually changed every file to standard output, but
didn't actually change the files themselves.

So how do you simply issue a command like this which will
automatically goes through the entire directory and changes
all the files in it.

thanks
0
Comment
Question by:webcs
  • 10
  • 4
  • 2
16 Comments
 
LVL 84

Accepted Solution

by:
ozo earned 20 total points
ID: 2551853
perl -i -pe 's/red/blue/g' *.*
0
 
LVL 40

Expert Comment

by:jlevie
ID: 2551897
In a Bourne or Bash shell:

> for file in dir/*; do
cp $file $file.tmp
sed -e "s/red/blue/g" $file.tmp >$file
rm $file.tmp
done
0
 
LVL 2

Author Comment

by:webcs
ID: 2552111
not generic enough, ozo's answer works..but thanks
0
 
LVL 2

Author Comment

by:webcs
ID: 2552117
perfect...thanks
0
 
LVL 40

Expert Comment

by:jlevie
ID: 2552192
Well, to each his own way. More generic? I don't think so. The perl variant may be more suited to your needs, but every Unix box will have Bourne shell and not all will have perl installed.
0
 
LVL 2

Author Comment

by:webcs
ID: 2552580
I tried the following:

perl -i -pe 's/red/blue/g' *.*

using hte following code:

perl -i -pe 's/(DOMAIN ONLY)/(D)/g' *.*

and the resultant came back as ((D))

Is there something else I have to include to change

(DOMAIN ONLY) to (D)

I assume in the first half its ignoring the ( and the ),
which I dont want it to do.

any suggestions?
0
 
LVL 2

Author Comment

by:webcs
ID: 2552587
I tried the following:

perl -i -pe 's/red/blue/g' *.*

using hte following code:

perl -i -pe 's/(DOMAIN ONLY)/(D)/g' *.*

and the resultant came back as ((D))

Is there something else I have to include to change

(DOMAIN ONLY) to (D)

I assume in the first half its ignoring the ( and the ),
which I dont want it to do.

any suggestions?
0
 
LVL 84

Expert Comment

by:ozo
ID: 2552657
#() are regular expression meta characters.
#to quote all meta characters, you can use
s/\Q(DOMAIN ONLY)/(D)/g
0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 
LVL 2

Author Comment

by:webcs
ID: 2552661
thank you!!!!!!!!
0
 
LVL 2

Author Comment

by:webcs
ID: 2552693
ozo...

just tried the following:

perl -i -pe 's/\Q(D)/D/g' *.*

and nothing changed...did you miss something?
0
 
LVL 2

Author Comment

by:webcs
ID: 2552728
ozo...

just tried the following:

perl -i -pe 's/\Q(D)/D/g' *.*

and nothing changed...did you miss something?
0
 
LVL 84

Expert Comment

by:ozo
ID: 2552737
It should work, unless you have an old version of perl.
what does
perl -v
show?
0
 
LVL 2

Author Comment

by:webcs
ID: 2552744
it shows version 4.0
0
 
LVL 2

Author Comment

by:webcs
ID: 2552745
I do have access to perl5 though by typing perl5 instead...shoudl I try that?
0
 
LVL 2

Author Comment

by:webcs
ID: 2552751
ok I tried the line using perl5 and it worked...guess perl 4 doesnt do it..weird...

thanks, ready to kill myself
0
 
LVL 84

Expert Comment

by:ozo
ID: 2552753
Yes, perl5 is the currently supported version.
in perl4, you could quote individual characters with
perl4 -i -pe 's/\(D\)/D/g' *.*

and if you're not sure if it will do what you want, you might want to test it with
perl -i.bak -pe 's/\(D\)/D/g' test.file
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Java core in Solaris 10 1 262
auto mounter on solaris 1 52
UNiX Script filesystem space usage Part2 54 78
Using gawk to read and manipulate multiple texts from a file 1 54
Hello fellow BSD lovers, I've created a patch process for patching openjdk6 for BSD (FreeBSD specifically), although I tried to keep all BSD versions in mind when creating my patch. Welcome to OpenJDK6 on BSD First let me start with a little …
This tech tip describes how to install the Solaris Operating System from a tape backup that was created using the Solaris flash archive utility. I have used this procedure on the Solaris 8 and 9 OS, and it shoudl also work well on the Solaris 10 rel…
Learn how to find files with the shell using the find and locate commands. Use locate to find a needle in a haystack.: With locate, check if the file still exists.: Use find to get the actual location of the file.:
This video shows how to set up a shell script to accept a positional parameter when called, pass that to a SQL script, accept the output from the statement back and then manipulate it in the Shell.

914 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

17 Experts available now in Live!

Get 1:1 Help Now