Как удалить определенный ключ из файла yaml в bash - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь удалить 1 ключ из файла YAML, который, например, выглядит следующим образом:

users:
  - aaa
  - bbb

roles:
  - aaa
  - bbb
  - ccc

Я ищу способ удалить только этот users.aaa, не касаясь roles.aaa,так что результат будет:

users:
  - bbb

roles:
  - aaa
  - bbb
  - ccc

Есть идеи?Было бы неплохо, если бы это могли сделать некоторые стандартные инструменты, без установки каких-либо дополнительных команд.

Я пытался использовать этот пример: Как удалить дочерний блок из YML в сценарии оболочки? но это не сработало.Я не мастер по awk.

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

Хороший вызов для сценария awk.Я бы попробовал следующий скрипт:

awk '/^[[:alpha:]]+:/ {level1=$0; next} level1 ~ "users" && /aaa/ {next} 1' input.yml
0 голосов
/ 24 мая 2019

Если вы можете полагаться на входные данные, которые должны быть отформатированы, как вы описываете (отмечая, что существуют альтернативные синтаксисы YAML для сопоставлений и последовательностей), то вы можете сделать это с помощью sed:

sed -i -e '/^users:/,/^[^ ]*:/!n;/[ ]\{1,\}-[ ]\{1,\}aaa/d' my_file.yaml

Это выражение sed немного сложнее, поэтому давайте разберем его.Есть две команды, разделенные точкой с запятой (;):

  • /^users:/,/^[^ ]*:/!n

    Это отрицательный (!) диапазон адресов для следующей строки(n) команда.Это приводит к тому, что все строки, не соответствующие диапазону адресов, будут передаваться без изменений на выход.Единственные строки, подлежащие дальнейшей обработке, - это строки в диапазоне (или диапазонах) строк, начинающихся с строки, соответствующей регулярному выражению /^users:/, и продолжающейся до следующей следующей строки, соответствующей регулярному выражению /^[^ ]*:/.Другими словами, сам ключ users, элементы значения, связанные с этим ключом, плюс (безвредно) сам следующий ключ.

  • /[ ]\{1,\}-[ ]\{1,\}aaa/d

    Эти строки, которые проходят через фильтр первой команды, подчиняются этой строке, которая соответствует элементу последовательности, который вы ищете по предоставленному регулярному выражению, и удаляет его (d) из выходных данных.Это последняя команда, поэтому строки, которые здесь не удаляются, передаются на выход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...