在文件中进行sed就地更改在Make对象中不起作用。
我想用在make对象中调用的sed替换文件中的一行。但是它似乎没有用。我该如何解决?
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外部运行。
答案 0 :(得分:1)
我无法使用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,]
,因为这样可以减少混乱。)如果这不能解决您的问题,我将需要了解以下信息:
答案 1 :(得分:0)
POSIX / GNU sed已c
用于“更改”:
sed -i '/SIM_MULTI=/c\SIM_MULTI=TRUE'
sed -i '/SIM_MISSED=/c\SIM_MISSED=TRUE'