sed -i command for in-place editing to work with both GNU sed and BSD/OSX
Actually, doing
sed -i -e "s/blah/blah/" files
doesn't do what you expect in MacOS either. Instead it creates backup files with -e
extension.
The proper command for MacOS is
sed -i "" -e "s/blah/blah/" files
On Linux, remove the space between -i
and ""
(see related answer)
sed -i"" -e "s/blah/blah/" files
OS X sed
handles the -i
argument differently to the Linux version.
You can generate a command that might "work" for both by adding -e
in this way:
# vv
sed -i -e 's|\(.*\)\.o:|$(OBJ_DIR)/\1.o $(OBJ_DIR)/\1.d $(TEST_OBJ_DIR)/\1_utest.o:|' $@
OS X sed -i
interprets the next thing after the -i
as a file extension for a backup copy of the in-place edit. (The Linux version only does this if there is no space between the -i
and the extension.) Obviously a side affect of using this is that you will get a backup file with -e
as an extension, which you may not want. Please refer to other answers to this question for more details, and cleaner approaches that can be used instead.
The behaviour you see is because OS X sed
consumes the s|||
as the extension (!) then interprets the next argument as a command - in this case it begins with t
, which sed
recognizes as a branch-to-label command expecting the target label as an argument - hence the error you see.
If you create a file test
you can reproduce the error:
$ sed -i 's|x|y|' test
sed: 1: "test": undefined label 'est'