Удалить блок из файла конфигурации - PullRequest
0 голосов
/ 05 октября 2019

У меня есть файл конфигурации, который имеет следующую структуру блоков:

{
  test,
  gracePeriodMinutes: "",
  silences: [
  {
"condition": "",
"silenceUntil": "XXXXXXXX",
"silenceComment": ""
 }
]
}

, и файл имеет несколько блоков.

Я хочу узнать, как удалить строки ПОСЛЕ "молчания": ["и ДО"] ". Я могу легко удалить часть include "silences: [" и "]" с помощью sed, но не могу понять, как их сохранить и удалить все, что находится между ними.

Ответы [ 2 ]

2 голосов
/ 05 октября 2019

Когда логика усложняется, часто проще использовать awk вместо sed. Попробуйте:

$ awk '/\]/{f=0}; f==0{print}; /silences: \[/{f=1}' file
{
  test,
  gracePeriodMinutes: "",
  silences: [
]
}

Как это работает:

Скрипт awk использует одну переменную f. В awk переменные по умолчанию равны нулю или пусты.

  • /\]/{f=0}

    Это говорит awk об установке нуля f всякий раз, когда мы достигаем строки, содержащей ].

  • f==0{print}

    Указывает awk распечатать строку, если f равно нулю.

  • /silences: \[/{f=1}

    Если текущая строка содержит silences: [, это говорит awk, чтобы установить f в единицу.

Наконец, программисты awk часто гордятся краткостью. В этом случае, поскольку {print} является действием по умолчанию, нам не нужно его включать:

awk '/\]/{f=0}; f==0; /silences: \[/{f=1}'

Или, поскольку в соответствии с правилами awk ноль равен false, мы могли бы написать f==0 какне - f или !f, и это делает код еще короче (подсказка: Jotne ):

awk '/\]/{f=0}; !f; /silences: \[/{f=1}' file

И, поскольку в этом случае нет никакой двусмысленности, мыможно пропустить первую из двух точек с запятой, сохранив еще один символ:

awk '/\]/{f=0} !f; /silences: \[/{f=1}' file
0 голосов
/ 05 октября 2019

Только что подумал, что я мог бы использовать приведенное ниже значение sed:

sed '/silences\:\ \[/,/\]/{//!s/.*//;}' file | sed '/^$/d'

Первая часть заменяет все строки между "silences: [" и "]" пустой строкой. Вторая часть удаляет пустые строки.

...