SED изменение файла внутри make - Как? - PullRequest
1 голос
/ 27 апреля 2019

SED изменение файла не работает внутри Make object.

Я хочу заменить строку в файле на sed, вызываемую в объекте make. Но, похоже, это не работает. Как я могу это исправить?

change_generics:
ifeq ($(run_TESTNAME), diagnostics)
    ifeq ($(run_TESTCASE), 1)
        sed -i -e "s/SIM_MULTI\==[a-z,A-Z]*/SIM_MULTI=TRUE/" ./generics.f
    else ifeq ($(TESTCASE), 2)
        sed -i -e "s/SIM_MISSED\==[a-z,A-Z]*/SIM_MISSED=TRUE/" ./generics.f
    endif
endif

Я бы хотел, чтобы файл generics.f изменялся с изменением в одну строку. Но он остается таким же, как оригинал. Команда sed работает вне make.

Ответы [ 2 ]

1 голос
/ 27 апреля 2019

Я не могу воспроизвести это, используя 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.
0 голосов
/ 27 апреля 2019

POSIX / GNU sed имеют c для «изменения»:

sed -i '/SIM_MULTI=/c\SIM_MULTI=TRUE'
sed -i '/SIM_MISSED=/c\SIM_MISSED=TRUE'
...