Попробуйте добавить начало дня с помощью команды find
find /path -type d -daystart -mtime +1
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
Протестировано с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
для редактирования на месте.
этого можно добиться с помощью 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);
?>