#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