As someone with a lot of Python experience, I normally try to stay away from Perl. However, I have really been impressed with its ability to work easily with regex and its integration with pipes/redirection for quick work on the CLI.

Normally, you can easily use Sed to find and replace text in a file with something like the following:

$ sed -i 's/SEARCH_FOR/REPLACE_WITH/g' file.txt

"One file? My Files have files!"

I get you. You could use a combination of find and xargs but honestly I find it to be a bit confusing. Instead this is when I like to break a handy perl one liner:

$ perl -pi -w -e 's/SEARCH_FOR/REPLACE_WITH/g;' *.txt

Options explained

-p:   Places a printing loop around your command so that it acts on each
      line of standard input. Used mostly so Perl can beat the
      pants off awk in terms of power AND simplicity
-i:   Modifies your input file in-place (making a backup of the
      original). Handy to modify files without the {copy,
      delete-original, rename} process.
-e:   Allows you to provide the program as an argument rather
      than in a file. You don't want to have to create a script
      file for every little Perl one-liner.
-w:   Activates some warnings. Any good Perl coder will use this.

You can use any separator/delimiter you want

For example, this would also be valid:

$ perl -pi -w -e 's|HELLO|BYE|g;' test.txt

A Truly recursive find and replace that ignores git repos

The one problem with the above Perl command though is that it does not handle recursing down folders.

For that, I usually break out the following command:

find . -not -path '*/\.git*' -type f -exec sed -i 's/search_text/replace_text/g' {} +


comments powered by Disqus