SED就地文件更改内部制作-如何?
文件上的sed就地更改在Make对象中不起作用 我想用make对象中调用的sed替换文件中的一行。但它似乎不起作用。我怎样才能解决这个问题SED就地文件更改内部制作-如何?,sed,makefile,Sed,Makefile,文件上的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 ($(TESTCA
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之外工作。
c
表示“更改”:
我无法使用GNU sed 4.2.2和GNU make 3.82再现这一点,或者至少,我无法再现任何场景,其中相同的sed命令从命令行工作,但不在Makefile中 更简单的生成文件:
全部:
#精心设计,以便我可以测试您的2 sed命令。
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\u MULTI=foo
SIM_MISSED=bar
测试:
$makeall
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命令都无法编辑包含此内容的文件
要修复:
可能需要从正则表达式中删除\=
。反斜杠there没有任何效果,只会使正则表达式匹配两个等号=
。因此,这项工作:
全部:
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
测试:
$makeall
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=真
进一步解释:
- 无需在此处指定
-e
- 不需要将脚本括在双引号中,因为它允许shell修改内容,所以风险更大
- 错误似乎是
,我删除了这些字符,如上所述\=
- 注意,我在
中删除了逗号[a-z,a-z]
。我想这可能不是你的意思,它会导致一类字符,包括,
,a-z
和一个逗号a-z
,被正则表达式匹配。(如果它是你的意思,你可以把它写为<代码> [AZ-Z,] /<代码>,因为那样就不会那么混乱了。,
- 您的sed版本是什么
- 泛型的内容是什么
sed
。然后每个命令都需要一个-e
(或者在单个字符串中用分号连接它们)。感谢@tripleee,这只是我简化了测试每个命令的过程,而OP将每个命令放在不同的if条件路径中。
sed -i '/SIM_MULTI=/c\SIM_MULTI=TRUE'
sed -i '/SIM_MISSED=/c\SIM_MISSED=TRUE'