从 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.json
、variables.tf.template
和 Makefile
.
生成文件:
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 }}
我做了以下修改:
- 使用
:=
而不是 =
。等于运算符是惰性替换运算符,它在使用宏时而不是在定义时扩展宏。
- 将 -r 与 jq 一起使用。这将获取原始字符串值。
- 使用
$(var)
而不是 $$(var)
。 Make 将双美元符号解释为转义美元符号。
我在 GNU Make 3.81 和 4.3 上测试了这个。
在 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.json
、variables.tf.template
和 Makefile
.
生成文件:
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 }}
我做了以下修改:
- 使用
:=
而不是=
。等于运算符是惰性替换运算符,它在使用宏时而不是在定义时扩展宏。 - 将 -r 与 jq 一起使用。这将获取原始字符串值。
- 使用
$(var)
而不是$$(var)
。 Make 将双美元符号解释为转义美元符号。
我在 GNU Make 3.81 和 4.3 上测试了这个。