How Do I Replace A Text String In Many Files At Once?

by Vivek Gite on November 12, 2005 · 16 comments

The replace command is a string-replacement utility. It changes strings in place in files or on the standard input. This command uses a finite state machine to match longer strings first. It can be used to swap strings. This command is similar to the Perl -pie syntax or sed (stream editor) command.

Please note that the replace command is part of is MySQL database system. If you don't have MySQL installed, you don’t have replace command.

Syntax

 
replace OLD-STRING NEW-STRING < INPUT-FILE > OUTPUT-FILE
 

Examples

To replace all occurrences of word UNIX with Linux, enter:
$ replace UNIX Linux < oldfile > newfile

The replace command can be used in a pipeline, run:
$ cat /etc/passwd | replace : '|'

You can skip the cat command, enter:
$ replace : '|' < /etc/passwd

It also supports few special characters in string replacement:

  • \^ : Match start of line.
  • $ : Match end of line.

How Do I Update All *.txt Files At Once?

You use bash for loop as follows:

#!/bin/bash
for f in /path/to/*.txt
do
   replace UNIX Linux < "$f" > "$f.new"
done
 

The replace command does not understand regular expression. To use regular expression try the sed command or Perl.

Sed Command Example

To replace all occurrences of word UNIX with Linux using the sed command, enter:

 
sed 's/UNIX/Linux/g' < input.file > output.file
 

OR

 
sed -i 's/UNIX/Linux/g' input.file
 

OR use bash shell for loop as follows to update all *.doc files at once:

#!/bin/bash
for f in /path/to/*.doc
do
   sed -i  's/UNIX/Linux/g' "$f"
done
 

Updated for accuracy!

Featured Articles:

Share this with other sys admins!
Facebook it - Tweet it - Print it -

We're here to help you make the most of sysadmin work. So, subscribe!

{ 16 comments… read them below or add one }

1 Joe November 12, 2005

To use perl, just remember Perl Pie!

perl -p -i -e ‘s/hello/goodbye/g’ textfile.txt

Reply

2 LinuxTitli November 12, 2005

Joe, very nice. Your tip sound yummy :) thanks for sharing with us

Reply

3 Anonymous November 30, 2005

http://www.debian-administration.org/articles/298 has a fine article and discussion on Perl Pie.

Reply

4 Anonymous December 12, 2005

what about this line:

perl -p -i -e ‘s/|00000000.00|/||/g’ myfile.txt

I want to replace |00000000.00| with ||

I get a compilation error.

Reply

5 nixcraft December 12, 2005

You need to write it as follows:

perl -p -i -e ‘s/|00000000.00|/||/g’ myfile.txt

|| got some special meaning (regex) | will disable it

Reply

6 Anonymous December 12, 2005

This does the trick perfectly! Thanks for sharing this special character technique nixcraft!

Reply

7 walter August 9, 2007

or try this…
first make a bash script, ‘fixer.sh’


#!/bin/bash
replace CHANGEFROM CHANGETO $1.tmp
rm $1
mv $1.tmp $1

now run this command line…

$ grep CHANGEFROM |cut -d':' -f1 |xargs -n 1 fixer.sh

the results is that all files in the directory (or whatever you grep for) will be changed automagically.

just make sure the grep doesn’t include the fixer script itself, or it will die half-way through changing when execute permissions are reset!

;)

Reply

8 Raj April 10, 2008

thanks for sharing this info

Reply

9 lefty.crupps June 16, 2008

Am I the only one who sees no difference in these?

>> perl -p -i -e ’s/|00000000.00|/||/g’ myfile.txt
>> I want to replace |00000000.00| with ||
>> I get a compilation error.

— —
>> You need to write it as follows:
>> perl -p -i -e ’s/|00000000.00|/||/g’ myfile.txt

Reply

10 Eden February 11, 2009

Cant see the diference… :(

Reply

11 2046 March 31, 2009

find ./* -type f -exec sed -i 's///g' {} \;

Reply

12 Matthew Scott July 18, 2010

`replace`

Reply

13 Matthew Scott July 18, 2010

`replace` can work with files, which may be simpler than writing a shell script as mentioned above. It will even convert files in place. Say you want to change an instance of ‘foo’ to ‘bar’ in all files in a certain directory, recursively. In bash,

for i in `grep -lR foo dir/to/files`; do replace foo bar — $i; done

Simply put, use two dashes to separate filenames from the from/to strings, and it’ll convert the files.

Reply

14 DougTheBug August 17, 2010

I couldn’t even find this command in Ubunto 10.04 (or in repositories). I ended up using rpl instead. Is really fun for databending images.

Reply

15 Ben March 7, 2011

‘Replace’ is found in mySQL. If you don’t have mySQL, you don’t have `replace`

Reply

16 saravanan January 4, 2012

I want to replace a string in sub directories also(in Linux), is there any specific command for that?

Reply

Leave a Comment

You can use these HTML tags and attributes for your code and commands: <strong> <em> <ol> <li> <u> <ul> <blockquote> <pre> <a href="" title="">
What is 10 + 13 ?
Please leave these two fields as-is:
Are you a human being? Solve the simple math so we know that you are a human and not a bot.




Previous post:

Next post: