我有一个要移植到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/

10-11 22:09
查看更多