我正在尝试使用 sed 从 yaml 文件中删除一段代码。到目前为止我所拥有的是下面的代码,但它不起作用。
sed -i 's/- node-service\/velocity_log_deployment((.|\n)*)//' config.yml
我要删除的代码是:
- terraform/init_and_plan:
name: terraform_plan
context:
- phdv-docker-hub-creds
- phdv-aws
terraform_version: <<pipeline.parameters.terraform_version>>
working_directory: ~/project/infra
persist_to_workspace_filepath_prefix: infra/
requires:
- package
# remove start
- node-service/velocity_log_deployment:
name: velocity_log_deployment
repository_url: https://github.com/pizzahutuk/lambda-contentful-menu-sync
requires:
- terraform_apply
context:
- phdv-docker-hub-creds
- phdv-aws
# remove end
- terraform/init_and_apply:
name: terraform_apply
context:
- phdv-docker-hub-creds
- phdv-aws
terraform_version: <<pipeline.parameters.terraform_version>>
working_directory: ~/project/infra
requires:
- terraform_plan
filters:
branches:
only: main
sed 替换后的结果:
- terraform/init_and_plan:
name: terraform_plan
context:
- phdv-docker-hub-creds
- phdv-aws
terraform_version: <<pipeline.parameters.terraform_version>>
working_directory: ~/project/infra
persist_to_workspace_filepath_prefix: infra/
requires:
- package
- terraform/init_and_apply:
name: terraform_apply
context:
- phdv-docker-hub-creds
- phdv-aws
terraform_version: <<pipeline.parameters.terraform_version>>
working_directory: ~/project/infra
requires:
- terraform_plan
filters:
branches:
only: main
答案1
诚实地;这是地形。这是一个巨大的软件,旨在帮助您通过代码部署基础设施;它使用明确定义的文件格式 YAML 来完成该任务。因此,保持这些文件语法完整非常重要。
尽管如此,您仍然选择使用不适合该语言的工具,sed
即使用正则表达式来解析非常规语言,而不是实际“讲该语言”的工具。
这里最正确的方法是忽略使用所做的事情sed
并仅使用,例如,如果您正在使用基斯柳克的yq
,它只允许del
ete 元素。
yq -y 'del(.[] | select(."node-service/velocity_log_deployment"))' config.yml
应该做你想做的事。添加-i
开关以就地更改文件。-y
如果您使用的是,请省略去yq
。