Replace Pattern Across Many Files In A Project

May 12, 2023 ยท View on GitHub

Let's say I have a bunch of files in the db/migrate directory of my project that contain a line of text I'd like to update. I want to replace all occurrences of t.bigint with t.integer.

First, I can get an idea of the scope of the change by listing out all the files and lines where this pattern exists using ripgrep.

$ rg 't.bigint' db/migrate

I can visually do a quick scan to make sure I'm not picking up results with my pattern that weren't intended.

Then, I can include the --files-with-matches flag to limit the ripgrep output to just filenames. Those filenames can be piped to sed (via xargs) which will do the pattern replacement.

$ rg --files-with-matches 't.bigint' db/migrate | \
  xargs sed -i '' 's/t.bigint/t.integer/g'

This does an in-place (-i '') edit of the files substituting (s///g) globally the occurrences of t.bigint for t.integer.