首页 > 解决方案 > 使用 php 或 bash 从目录中的 yaml 文件中删除 yaml 属性及其定义

问题描述

我有许多 yaml 文件,它们在多行上有一个属性定义:

  approval_date:
    label: inline
    type: datetime_plain
    weight: 3
    region: content
    settings:
      timezone_override: ''
    third_party_settings: {  }

我希望能够从所有 yaml 文件中删除approval_date 及其定义。我尝试了一个简单的正则表达式搜索和替换,它在一定程度上起作用,但定义因不同文件而异。有没有一种更简单的方法可以使用 bash 脚本或类似的东西来删除属性及其定义?

标签: phpbash

解决方案


Bash 本身不会处理 yaml,而且我还没有成功使用任何应该为它添加半心半意的支持的各种库。

但是,我已经成功地将 yaml 视为 JSON 使用y2j,这允许您的 yaml 使用jq.

见证:

$ cat x.yml
  keep_me: foo
  approval_date:
    label: inline
    type: datetime_plain
    weight: 3
    region: content
    settings:
      timezone_override: ''
    third_party_settings: {  }
  more_to_keep:
    label: bar
$ yq 'del(.approval_date)' < x.yml
keep_me: foo
more_to_keep:
  label: bar

请注意,该yq命令是指向y2j.shbash 脚本的链接。jq可以使用操作系统的普通包管理器将该命令添加到您的系统中。

当然,仅在 PHP 中执行此操作可能更容易。

$ php -r '$a=yaml_parse_file("x.yml"); unset($a["approval_date"]); print_r($a);'
Array
(
    [keep_me] => foo
    [more_to_keep] => Array
        (
            [label] => bar
        )

)

甚至:

$ php -r '$a=yaml_parse_file("x.yml"); unset($a["approval_date"]); print yaml_emit($a);'
---
keep_me: foo
more_to_keep:
  label: bar
...

推荐阅读