Find and Replace Inside a Text File from a Bash Command

bash, ironpython, replace, scripting

Solution

The easiest way is to use `sed` (or Perl):

sed -i -e 's/abc/XYZ/g' /tmp/file.txt

which will invoke `sed` to do an in-place edit due to the `-i` option. The `/g` flag for `sed`'s `s` command says to replace globally, i.e. do not substitute only the first occurrence on each input line. This can be called from Bash.

(The `-i` option is not standard. On BSD-based platforms, including MacOS, you need an explicit option argument `-i ''`.)

If you really really want to use just Bash, then the following can work:

while IFS='' read -r a; do
    echo "${a//abc/XYZ}"
done < /tmp/file.txt > /tmp/file.txt.t
mv /tmp/file.txt{.t,}

This loops over each line, doing a substitution, and writing to a temporary file (don't want to clobber the input). The `mv` at the end just moves the temporary file to the original name. (For robustness and security, the temporary file name should not be static or predictable, but let's not go there.)

This uses a Bash-only parameter expansion to perform a replacement on the variable's value.

Problem

What's the simplest way to do a find and replace for a given input string, say `abc`, and replace with another string, say `XYZ` in file `/tmp/file.txt`? I am writing an app and using IronPython to execute commands through SSH — but I don't know Unix that well and don't know what to look for. I have heard that Bash, apart from being a command line interface, can be a very powerful scripting language. If this is true, I assume you can perform actions like these. Can I do it with Bash, and what's the simplest (one line) script to achieve my goal?

Original source

Related problems