Как удалить все определенные подразделы -определенного заголовка в файле YAML?

Попробуйте добавить начало дня с помощью команды find

find /path -type d -daystart -mtime +1
4
21.05.2021, 10:59
3 ответа
yq -y 'del(."/image-content")' file.yml

При этом используется yqизhttps://kislyuk.github.io/yq/для удаления верхнего раздела -уровня /image-contentиз документа YAML с помощью команды del().

Учитывая пример документа в вопросе, как -, это приведет к тому, что следующий документ YAML будет записан на терминал:

/text-content:
  post:
    operationId: createStaticText
    summary: Process text events
    description: Process text events
    parameters: []
    requestBody: null

Перенаправьте это в новый файл, если вы хотите его сохранить, или используйте опцию --in-placeдля редактирования -места (после тестирования без этой опции, конечно ).

yqпредставляет собой оболочку парсера JSON jq, позволяющую использовать выражение jqдля работы с файлами YAML.


Если документ в вопросе является частичным и не показывает его истинную структуру (, дополнительные два пробела отступа подразумевают, что мы видим разделы на вторичном уровне ),тогда вам может понадобиться использовать

yq -y 'del(.[]."/image-content")' file.yml

Выражение .[]."/image-content"относится к «любому разделу /image-contentнепосредственно под верхним уровнем».

Для рекурсивного поиска и удаления /image-contentразделов, независимо от того, где в документе они могут встречаться, используйте

yq -y 'del(.. |."/image-content"?)' file.yml

Выражение, используемое в del(), рекурсивно проходит через структуру документа, используя ..и извлекает любой раздел с именем /image-content, где есть один (, который соответствует оператору //в запросах XPath ). ]. Затем они удаляются.


Ответ на ваш обновленный вопрос:

yq -y '.components |= with_entries(del(select(.key | startswith("/static/"))) // empty)' file.yml

Это обновляет раздел components, беря его подразделы, временно превращая их в отдельные значения keyи value(см. документацию по with_entries()в руководстве jq), выбирая и удаляя те, у которых ключи начинаются с точной строки /static/.

Бит // empty:Результатом операции del()являются значения null. Их нельзя вернуть из значений keyи valueв соответствующие подразделы, поэтому вместо этого я меняю их на значения empty, после чего они полностью исчезают. Честно говоря, я не совсем уверен во внутренней работе, связанной с этим.

Это приводит к

openapi: 3.0.0
components:
  /api/hello:
    post:
      type: hello
9
28.07.2021, 11:34

Протестировано сGNU sed:

sed -n '
    /^\s*\/static/ {
        n
        :c
            /^[[:space:]]*\//! {
                n
                bc
            }
        }
    p
' data

Тогда для второго вопроса в основном то же самое:

sed -n '
    /^[[:space:]]\+\/image-content:$/ {
        n
        :c
            /^[[:space:]]\+\//! {
                n
                bc
            }
    }
    p
' data

Первая строка ищет нужный абзац, затем зацикливается и удаляет каждую его строку, пока не будет найден новый абзац. Конечно, вы можете вставить флаги -iдля редактирования на месте.

1
28.07.2021, 11:34

этого можно добиться с помощью php Я создал простую программу, которая делает это, вы можете изменить жестко заданные переменные для аргументов командной строки в зависимости от вашего варианта использования (Я использовал для этого php7.4)

<?php
// Config:
$fileinname="data.yaml"; // file to take data from
$fileoutname="out.yaml"; // file to write output to
$break=['/image-content/','/text-content/']; // Regex patterns for lines to delete between
// End of conifg

$out="";
$stage=0;
$file=file($fileinname);
for ($i=0;$i<count($file);$i++){
    if ($stage == 0){
        if (preg_match($break[0],$file[$i])){
            $stage++;
        }
        else {
            $out.=$file[$i];
        }
        
    }
    elseif ($stage == 1) {
        if (preg_match($break[1],$file[$i])){
            $stage++;
            $out.=$file[$i];
        }
    }
    elseif ($stage == 2){
        $out.=$file[$i];
    }
}
file_put_contents($fileoutname,$out);
?>
0
28.07.2021, 11:34

Теги

Похожие вопросы