search and replace string on multiple files from unix terminal

26,018

Solution 1

Try this:

find . -name '*.html' -exec sed -i 's/\.html/\.php/g' "{}" \;

It will find all files in the current and subdirectories that end in .html, and run sed on each of them to replace .html with .php anywhere it appears within them.

See http://content.hccfl.edu/pollock/unix/findcmd.htm for more details.

Solution 2

On my Mac, I had to add a parameter to the -i option: the extension to add to the name (in this case, nothing, so the file is stored in-place).

find . -name '*.html' -exec sed -i '' 's/\.html/\.php/g' "{}" \;
Share:
26,018
Benny Tjia
Author by

Benny Tjia

If tiger is exception, then I catch tiger for a living.

Updated on July 09, 2022

Comments

  • Benny Tjia
    Benny Tjia almost 2 years

    We are converting all the static html pages in our codebase into php pages. The first step would be to change all the .html file extension to .php (which I already did). The second step would be to update all the links within each of those html pages to point to new php pages.

    (for instance, inside index.php i have links to both contact.html and about-us.html. Now since we have replaced every .html file extension to .php, we need to change contact.html to contact.php, and likewise, about-us.html to about-us.php).

    what i want to do now is to search for a particular string across multiple files. (search for "contact.html" inside many files, such as index.php, index2.php, index3.php, etc etc..) after that, replace all "contact.html" in all those files with "contact.php".

    I am not familiar with unix command line, and i so far have seen other people's similar questions here in the forum but not quite understand which one could help me achieve what i want. I'm using cygwin and if possible i need to solve this without perl script since i dont have it installed. i need to try using either sed, grep, find, or anything else.

    So, if any of you think that this is a duplicate please point me to a relevant post out there. thanks for your time.

  • Jonathan Leffler
    Jonathan Leffler over 12 years
    This works with GNU sed; it won't necessarily work on other Unix platforms because of the non-standard -i option to sed.
  • Adam Liss
    Adam Liss over 12 years
    @JonathanLeffler: Yes, how spoiled we become. :-)