sed-i команда, чтобы оперативное редактирование работало и с GNU sed и с BSD/OSX

У меня есть 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 обрубает символ, но я не вижу решения.

59
задан jww 28 October 2019 в 16:52
поделиться

2 ответа

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'
64
ответ дан 24 November 2019 в 18:01
поделиться

На самом деле выполнение

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
50
ответ дан 24 November 2019 в 18:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: