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

文件上的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之外工作。

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'