当前位置: 首页 > 知识库问答 >
问题:

提取将YAML中的正则表达式与布尔值匹配的键值对

夹谷斌蔚
2023-03-14

下面是我的YAML输入,我试图使用yq提取显示的输出。我想删除键名(VAR-A)在value{A.b.VAR-A}(在A.b.之后)中匹配的对,如果在-分隔的值中有多个{A.b.VAR-A},我想保留它们。

VAR-A: '{{a.b.VAR-A}}'
VAR-B: '{{a.b.VAR-B}}'
VAR-C: v0.0
VAR-D: '{{a.b.VAR-D}}-{{a.b.VAR-A}}'
VAR-E: '{{a.b.VAR-C}}-{{a.b.VAR-B}}-{{a.b.VAR-A}}'
VAR-F: True

预期产出:

VAR-C: v0.0
VAR-D: '{{a.b.VAR-D}}-{{a.b.VAR-A}}'
VAR-E: '{{a.b.VAR-C}}-{{a.b.VAR-B}}-{{a.b.VAR-A}}'
VAR-F: True

如果我有所有字符串,这个问题就可以解决,但是当我在yaml中有boolean值时,这个问题就失败了。使用yq/sed/grep提取与YAML中的正则表达式匹配的键值对

我得到以下错误:

错误:无法替换为!!布尔,只能替换字符串。提示:对于此操作,您通常需要在“=”上使用“|=”键。

共有1个答案

张成济
2023-03-14

至少有两个非常不同的现存“yq”项目:一个是基于Python的项目,这是下面第1部分的重点;另一个是基于Go的项目,这是第2部分的重点。

python-yq 'del(.[] | select( ( type == "string" and test("^{{a[.]b[.][^}]*}}$" ))))' so-vars.yaml

或者

python-yq  'map_values( select( ( type == "string" and test("^{{a[.]b[.][^}]*}}$" )) | not))' so-vars.yaml
{
  "VAR-C": "v0.0",
  "VAR-D": "{{a.b.VAR-D}}-{{a.b.VAR-A}}",
  "VAR-E": "{{a.b.VAR-C}}-{{a.b.VAR-B}}-{{a.b.VAR-A}}",
  "VAR-F": true
}

我拥有的基于Go的yq版本(4.6.3)可能无法直接处理您的需求,但这里有一个解决方案,使用这个yq来翻译JSON,并使用jq来完成其余的工作:

yq -j eval . input.yaml |
  jq  'del(.[] | select(( type == "string" and test("^{{a[.]b[.][^}]*}}$" ))))' > tmp.json
yq -P eval . tmp.json

jq程序的del-免费版本:

map_values( select( type == "string" and test("^{{a[.]b[.][^}]*}}$" | not)
VAR-C: v0.0
VAR-D: '{{a.b.VAR-D}}-{{a.b.VAR-A}}'
VAR-E: '{{a.b.VAR-C}}-{{a.b.VAR-B}}-{{a.b.VAR-A}}'
VAR-F: true
 类似资料:
  • 问题内容: 我正在制作一个键值解析器,其中输入字符串采用的形式。键可以包含字符,并且和值可以包含任何字符,但,,和需要用反斜杠前缀。逗号用于分隔键值对,但在最后一对之后不需要。 到目前为止,我已经可以匹配大多数键和值,但是很显然它将不能处理多于一对的字符或者任何“控制”字符都不能转义。似乎匹配所有转义字符,但不匹配任何“正常”字符。 有没有办法检查逗号分隔并匹配所有转义的“控制”字符以及普通字符?

  • 有没有人试图描述与正则表达式匹配的正则表达式? 由于重复的关键字,这个主题几乎不可能在网上找到。 它可能在实际应用程序中不可用,因为支持正则表达式的语言通常具有解析它们的方法,我们可以将其用于验证,以及一种在代码中分隔正则表达式的方法,可用于搜索目的。 但是我仍然想知道匹配所有正则表达式的正则表达式是什么样子的。应该可以写一个。

  • 我想从与正则表达式模式匹配的字符串中提取子字符串。 所以我在寻找这样的东西: 这就是我所拥有的: 问题是,为我提供了一个数组,其中的类型为。 < code>NSRange与< code >范围不兼容 知道如何在没有太多代码行的情况下在 swift 中实现这个简单的事情吗?

  • 问题内容: 我有一个看起来像这样的Yaml ..!用户可以定义的N个,其中关键将是常见的。目的是获取密钥并从中提取价值。 我能够找到正则表达式来匹配。但是,在尝试在代码中使用它时会引发错误。这是我的代码。 正在转储整个YAML文件(预期)。之后立即回溯。 问题答案: 您需要此正则表达式。我将其分组为键值对: Python演示:https://repl.it/Lk5W/0

  • 我有一根线,比如: 如何匹配每行的最后一个?顺便说一句,这是我试图在Sublime的文本中做到的。这些值不一致,就像我在这里看到的,我有几百行要替换。 我尝试了,但这与相匹配。

  • 我正在尝试编写一个pact消费者测试来匹配下面的响应。 每个schedule对象由与一个简单正则表达式匹配的未知数量的键组成。但是我没有看到一种方法可以使用正则表达式来匹配键,同时将值映射到一个简单的布尔值。 但这需要一个新的对象作为值,而不是一个基元类型。 有没有办法在pact-jvm中指定映射到基元值的不精确键?