Когда логика усложняется, часто проще использовать 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