我有一个要移植到MacOS的makefile(在Linux上为gmake
开发),但是sed
似乎不想合作。我要做的是使用GCC
自动生成依赖项文件,然后使用sed
对其进行一些调整。 makefile
的相关部分:
$(OBJ_DIR)/%.d: $(SRC_DIR)/%.cpp
$(CPPC) -MM -MD $< -o $@
sed -i 's|\(.*\)\.o:|$(OBJ_DIR)/\1.o $(OBJ_DIR)/\1.d $(TEST_OBJ_DIR)/\1_utest.o:|' $@
尽管此程序在GNU / Linux下可以正常运行,但尝试在MacOS上构建时却出现类似以下的错误:
sed: 1: "test/obj/equipmentConta ...": undefined label 'est/obj/equipmentContainer_utest.d'
sed: 1: "test/obj/dice_utest.d": undefined label 'est/obj/dice_utest.d'
sed: 1: "test/obj/color-string_u ...": undefined label 'est/obj/color-string_utest.d'
似乎
sed
砍掉了一个字符,但我看不到解决方案。 最佳答案
OS X sed
处理-i
参数的方式与Linux版本不同。
您可以通过添加-e
来生成可能对两者都“起作用”的命令:
# vv
sed -i -e 's|\(.*\)\.o:|$(OBJ_DIR)/\1.o $(OBJ_DIR)/\1.d $(TEST_OBJ_DIR)/\1_utest.o:|' $@
OS X
sed -i
将-i
之后的下一个内容解释为就地编辑的备份副本的文件扩展名。 (Linux版本仅在-i
和扩展名之间没有空格的情况下才这样做。)显然,使用此方法的副作用是,您将获得一个备份文件,其中-e
作为扩展名,您可能不希望这样做。 请参阅此问题的其他答案以获取更多详细信息,以及可以使用的更清洁的方法。您看到的行为是因为OS X
sed
使用s|||
作为扩展名(!),然后将下一个参数解释为命令-在这种情况下,它以t
开头,sed
识别为期望目标标签的分支到标签的命令作为参数-因此您会看到错误。如果创建文件
test
,则可以重现该错误:$ sed -i 's|x|y|' test
sed: 1: "test": undefined label 'est'
关于macos - sed -i命令,用于就地编辑以与GNU sed和BSD/OSX一起使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2320564/