Error when using 'sed' with 'find' command on OS X: "invalid command code ."

BashMacosSedFind

Bash Problem Overview


Being forced to use CVS for a current client and the address changed for the remote repo. The only way I can find to change the remote address in my local code is a recursive search and replace.

However, with the sed command I'd expect to work:

find ./ -type f -exec sed -i "s/192.168.20.1/new.domain.com/" {} \;

I get an error for every file:

sed: 1: ".//file/path ...": invalid command code .

I've tried to escape the periods in the sed match/replacement but that doesn't solve anything.

Bash Solutions


Solution 1 - Bash

If you are on a OS X, this probably has nothing to do with the sed command. On the OSX version of sed, the -i option expects an extension argument so your command is actually parsed as the extension argument and the file path is interpreted as the command code.

Try adding the -e argument explicitly and giving '' as argument to -i:

find ./ -type f -exec sed -i '' -e "s/192.168.20.1/new.domain.com/" {} \;

See this.

Solution 2 - Bash

You simply forgot to supply an argument to -i. Just change -i to -i ''.

Of course that means you don't want your files to be backed up; otherwise supply your extension of choice, like -i .bak.

Solution 3 - Bash

On OS X nothing helps poor builtin sed to become adequate. The solution is:

brew install gnu-sed

And then use gsed instead of sed, which will just work as expected.

Solution 4 - Bash

Simply add an extension to the -i flag. This basically creates a backup file with the original file.

sed -i.bakup 's/linenumber/number/' ~/.vimrc

sed will execute without the error

Solution 5 - Bash

Probably your new domain contain / ? If so, try using separator other than / in sed, e.g. #, , etc.

find ./ -type f -exec sed -i 's#192.168.20.1#new.domain.com#' {} \;

It would also be good to enclose s/// in single quote rather than double quote to avoid variable substitution or any other unexpected behaviour

Solution 6 - Bash

It is not the case for the OP but it was for me and could help someone else.

If you are using ' to enclose regex, double check the ' characters. I was copying and pasting the script and OSX was replacing ' by ā€™ in bash.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionhelion3View Question on Stackoverflow
Solution 1 - BashdamienfrancoisView Answer on Stackoverflow
Solution 2 - BashmdupView Answer on Stackoverflow
Solution 3 - BashDmitry MikushinView Answer on Stackoverflow
Solution 4 - BashMoza ManView Answer on Stackoverflow
Solution 5 - BashjkshahView Answer on Stackoverflow
Solution 6 - BashRicardo BRGWebView Answer on Stackoverflow