在make中更改SED inplace文件-如何?

时间:2019-04-26 23:13:34

标签: 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 ($(TESTCASE), 2)
        sed -i -e "s/SIM_MISSED\==[a-z,A-Z]*/SIM_MISSED=TRUE/" ./generics.f
    endif
endif

我希望对generics.f文件所做的更改只有这一行。但它与原始版本相同。 sed命令可在make外部运行。

2 个答案:

答案 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-zA-Z 逗号,在内的一类字符被匹配正则表达式。 (如果这是您的意思,则可以考虑将其写为[a-zA-Z,],因为这样可以减少混乱。)

如果这不能解决您的问题,我将需要了解以下信息:

  • 您的sed是什么版本。
  • generics.f中的内容是什么。

答案 1 :(得分:0)

POSIX / GNU sed已c用于“更改”:

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