Solved

Using sed to change a string in an entire directory

Posted on 2000-02-23
16
228 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
Free Tool: Postgres Monitoring System

A PHP and Perl based system to collect and display usage statistics from PostgreSQL databases.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
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
 
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

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

A metadevice consists of one or more devices (slices). It can be expanded by adding slices. Then, it can be grown to fill a larger space while the file system is in use. However, not all UNIX file systems (UFS) can be expanded this way. The conca…
FreeBSD on EC2 FreeBSD (https://www.freebsd.org) is a robust Unix-like operating system that has been around for many years. FreeBSD is available on Amazon EC2 through Amazon Machine Images (AMIs) provided by FreeBSD developer and security office…
Learn several ways to interact with files and get file information from the bash shell. ls lists the contents of a directory: Using the -a flag displays hidden files: Using the -l flag formats the output in a long list: The file command gives us mor…
Learn how to get help with Linux/Unix bash shell commands. Use help to read help documents for built in bash shell commands.: Use man to interface with the online reference manuals for shell commands.: Use man to search man pages for unknown command…

856 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