从 Makefile 使用 sed

Using sed from Makefile

Makefile 中,我正在尝试执行以下操作:

这里我得到了一些我需要的东西:

    S3_BUCKET_NAME_STATE=$(shell terraform output -json | jq '.S3_Bucket.value')
    DYNAMODB_LOCK=$(shell terraform output -json | jq '.dynamo_db_lock.value')

结果(即:变量中的内容)我想在文件中进行一些替换,如下所示:

    sed 's/{{ BUCKET_NAME }}/$$(S3_BUCKET_NAME_STATE)/g;' variables.tf.template > variables.tf)

但它总是做错了。我试过使用 ${} 代替,但我无法让它工作...

感谢帮助!

你没有提到这些是 make 变量还是 shell 变量,所以我假设它们是 make 变量。

这是一个如何执行此操作的工作示例。它有 3 个文件:test.jsonvariables.tf.templateMakefile.

生成文件:

S3_BUCKET_NAME_STATE := $(shell cat test.json | jq -r '.S3_Bucket.value')

all:
    sed 's/{{ BUCKET_NAME }}/$(S3_BUCKET_NAME_STATE)/g;' variables.tf.template > variables.tf

test.json:

{"S3_Bucket": {"value": "Foo"}}

variables.tf.template:

some stuff {{ BUCKET_NAME }}

我做了以下修改:

  1. 使用 := 而不是 =。等于运算符是惰性替换运算符,它在使用宏时而不是在定义时扩展宏。
  2. 将 -r 与 jq 一起使用。这将获取原始字符串值。
  3. 使用 $(var) 而不是 $$(var)。 Make 将双美元符号解释为转义美元符号。

我在 GNU Make 3.81 和 4.3 上测试了这个。