Извлеките пары значений ключей, соответствующие регулярному выражению в YAML, с помощью yq/sed/grep

#regex #shell #sed #grep #yaml

Вопрос:

У меня есть это ниже ввода YAML, и я пытаюсь извлечь показанный вывод с помощью yq

Ввод:

 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: '{{a.b.VAR-F}}'
 

Ожидаемый Результат:

 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}}'
 

Моя Попытка:

 yq eval 'del( .[] | select (. == "{{a.b.*" ) )' abc.yaml
 

Я новичок в yq этом деле, и любая помощь будет очень признательна.

На основе комментария @Inian

**Примечание: Я хочу удалить пары , в которых имя ключа (VAR-A) в значении {{a.b.VAR-A}} (после a.b.) совпадает, и если у меня больше {{a.b.VAR-A}} в значениях, разделенных -, я хочу сохранить их

Комментарии:

1. Логика не имеет смысла, почему следует исключить VAR-A, VAR-B, VAR-F/

2. @Inian Я хочу удалить пары , в которых имя ключа ( VAR-A ) в значении {{a.b.VAR-A}} (после a.b. ) совпадает, и если у меня больше, чем {{a.b.VAR-A}} в значениях, разделенных - , я хочу сохранить их.

3. Я не думаю, что это просто с yq

4. @Inian Есть ли какие-либо другие альтернативы, к которым мы можем подойти?

Ответ №1:

Это то, чего вы ожидали ?

 yq eval 'del(.[] | select(sub("^{{a.b.[^}] }}$","")=="" ))' abc.yaml
 

Регулярное выражение ^{{a.b.[^}] }}$ соответствует одной структуре {{ … }}, из-за ^ и $ в начале и в конце. [^}] означает любой символ, которого нет } .

Затем он заменяется пустой строкой, если в результате снова получается пустая строка, она выбирается для удаления.

Если вы просто хотите соответствовать {{a.b.VAR-A}} :

 yq eval 'del(.[] | select(sub("^{{a.b.VAR-A}}$","")=="" ))' abc.yaml
 

Комментарии:

1. Да, это именно то, чего я ожидаю. Но можете ли вы объяснить, что вы делаете с регулярным выражением?

2. Можно ли сопоставить VAR-A в {{a.b.VAR-A}} ?

3. Это не удается, когда у нас есть логические значения, такие как VAR-F: True