What GNU/Linux command-line tool would I use for performing a search and replace on a file?

20,865

Solution 1

sed 's/a.*b/xyz/g;' old_file > new_file

GNU sed (which you probably have) is even more versatile:

sed -r --in-place 's/a(.*)b/x\1y/g;' your_file

Here is a brief explanation of those options:

-i[SUFFIX], --in-place[=SUFFIX] edit files in place (makes backup if extension supplied)

-r, --regexp-extended use extended regular expressions in the script.

The FreeBSD, NetBSD and OpenBSD versions also supports these options.

If you want to learn more about sed, Cori has suggested this tutorial.

Solution 2

Perl was invented for this:

perl -pi -e 's/foo/bar/g;' *.txt

Any normal s/// pattern in those single quotes. You can keep a backup with something like this:

perl -pi.bak -e 's/foo/bar/g;' *.txt

Or pipeline:

cat file.txt | perl -ne 's/foo/bar/g;' | less

But that's really more sed's job.

Solution 3

Consider Ruby as an alternative to Perl. It stole most of Perl's one-liner commandline args (-i, -p, -l, -e, -n) and auto-sets $_ for you like Perl does and has plenty of regex goodness. Additionally Ruby's syntax may be more comfortable and easier to read or write than Perl's or sed's. (Or not, depending on your tastes.)

ruby -pi.bak -e '$_.gsub!(/foo|bar/){|x| x.upcase}' *.txt

vs.

perl -pi.bak -e 's/(foo|bar)/\U\1/g' *.txt

In many cases when dealing with one-liners, performance isn't enough of an issue to care whether you use lightweight sed or heavyweight Perl or heaveier-weight Ruby. Use whatever is easiest to write.

Solution 4

sed, the stream editor, and yes, it uses regex.

Share:
20,865

Related videos on Youtube

Nitin
Author by

Nitin

C/C++/Java developer. Currently working on embedded systems virtualization technology.

Updated on July 09, 2022

Comments

  • Nitin
    Nitin almost 2 years

    What GNU/Linux command-line tool would I use for performing a search and replace on a file?

    Can the search text, and replacement, be specified in a regex format?

  • Sam Stokes
    Sam Stokes over 15 years
    I didn't know about the -r switch to allow extended regex - handy! Also, -i is a shortcut for --in-place.
  • Colin K
    Colin K over 12 years
    Thanks for the helpful example! I think it could be simplified (slightly) by: ruby -pi.bak -e 'gsub(/foo|bar/){|x| x.upcase}' *.txt (eg, removing the $_).