Я не могу воспроизвести это, используя GNU sed 4.2.2 и GNU make 3.82, или, по крайней мере, я не могу воспроизвести ни один сценарий, в котором та же команда sed работает из командной строки, но не в Makefile.
Более простой Makefile:
all:
# Contrived just so I can test your 2 sed commands.
sed -i -e "s/SIM_MULTI\==[a-z,A-Z]*/SIM_MULTI=TRUE/" ./generics.f
sed -i -e "s/SIM_MISSED\==[a-z,A-Z]*/SIM_MISSED=TRUE/" ./generics.f
Пример содержимого файла в generics.f:
SIM_MULTI=foo
SIM_MISSED=bar
Тестирование:
$ make all
sed -i -e "s/SIM_MULTI\==[a-z,A-Z]*/SIM_MULTI=TRUE/" ./generics.f
sed -i -e "s/SIM_MISSED\==[a-z,A-Z]*/SIM_MISSED=TRUE/" ./generics.f
Подтверждено, что обе команды sed не могут редактировать файл с этим содержимым.
Исправить:
Возможно, вам нужно просто удалить \=
из вашего регулярного выражения. Обратная косая черта там не действует и заставляет ваше регулярное выражение просто соответствовать двум знакам равенства ==
. Таким образом, это работает:
all:
sed -i 's/SIM_MULTI=[a-zA-Z]*/SIM_MULTI=TRUE/' ./generics.f
sed -i 's/SIM_MISSED=[a-zA-Z]*/SIM_MISSED=TRUE/' ./generics.f
Тестирование:
$ make all
sed -i 's/SIM_MULTI=[a-zA-Z]*/SIM_MULTI=TRUE/' ./generics.f
sed -i 's/SIM_MISSED=[a-zA-Z]*/SIM_MISSED=TRUE/' ./generics.f
$ cat generics.f
SIM_MULTI=TRUE
SIM_MISSED=TRUE
Дальнейшее объяснение:
- Нет необходимости указывать
-e
там.
- Нет необходимости заключать скрипт в двойные кавычки, что более рискованно, поскольку позволяет изменять содержимое оболочкой.
- Ошибка, как представляется,
\=
, и я удалил эти символы, как указано выше.
- Обратите внимание, что я также удалил запятую
,
в [a-z,A-Z]
. Я думаю, что это, вероятно, не то, что вы имели в виду, и это приведет к тому, что класс символов, включающий a-z
, A-Z
и запятую ,
, будет совпадать с регулярным выражением. (И если это то, что вы имеете в виду, вы можете написать это как [a-zA-Z,]
, поскольку это будет менее запутанным.)
Если это не решило вашу проблему, мне нужно знать такие вещи, как:
- Какая версия вашего седа.
- Что содержится в generics.f.