Если вы можете полагаться на входные данные, которые должны быть отформатированы, как вы описываете (отмечая, что существуют альтернативные синтаксисы 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
) из выходных данных.Это последняя команда, поэтому строки, которые здесь не удаляются, передаются на выход.