f=/path/to/file; sed -e "s/pattern/replacement/" "$f" > "$f".bak && mv "$f".bak "$f"
At a high level, this involves two main steps:
We use sed ("stream editor for filtering and transforming text") to read the content of the file and replace the regex pattern. With the -e flag we specify an expression to execute, in this example a pattern replacement.
sed prints its output on standard output (stdout), we use > "$f".bak to redirect that to a backup file.
We chain an mv command after sed with && to ensure that we only perform the mv command if the sed command was successful.
Although sed has an -i flag to manipulate the input file in-place without needing a backup file as in this example, unfortunately the behavior of this flag depends on the implementation of sed.
The GNU equivalent of the one-liner:
sed -ie "s/pattern/replacement/" "$f"
The BSD equivalent of the one-liner:
sed -i .bak -e "s/pattern/replacement/" "$f" && rm "$f"