У меня есть make-файл (разработанный для gmake
на Linux), что я пытаюсь портировать на MacOS, но это походит 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 |||
как расширение (!), А затем интерпретирует аргумент next как команду - в этом случае он начинается с t
, который sed
распознает как команду перехода к метке, ожидающую в качестве аргумента целевую метку - отсюда и ошибка, которую вы видите.
Если вы создадите файл test
, вы сможете воспроизвести ошибку:
$ sed -i 's|x|y|' test
sed: 1: "test": undefined label 'est'
На самом деле выполнение
sed -i -e "s/blah/blah/" files
не дает того, что вы ожидаете от MacOS. Вместо этого он создает файлы резервных копий с расширением -e
.
Правильная команда для MacOS:
sed -i "" -e "s/blah/blah/" files
В Linux удалите пробел между -i
и ""
(см. ответ )
sed -i"" -e "s/blah/blah/" files