find and replace text
If you find yourself in the situation of needing to find and replace text in multiple files, use the Command Line Interface. I wanted to rename a Phoenix application and ran the below command.
ack pivotal_commentor -l | xargs sed -i '' 's/pivotal_commentor/commentor/g'
Let’s break this command down with a simple example.
mkdir test
cd test
touch file1.txt
touch file2.txt
And lets add the text ‘hello’ to both text files.
ack hello -l
file1.txt
file2.txt
ack is like grep and found the files containing the string hello. The -l flag “Only print filenames containing matches”
ack hello -l | xargs
file1.txt file2.txt
xargs is a Unix utility that constructs argument lists and is smashing the filenames into one line.
Finally, we pipe the arguments from xargs to sed.
ack hello -l | xargs sed -i '' 's/hello/bye/g'
The -i flag allows for in place editing on the file. In the regex, the s replaces hello with bye and the g indicates globally, in case hello is found more than once in the file. The “ is sending the change into the correct output file.