Используйте -F
отметьте к хвосту (предполагающий, что Вы имеете tail
от GNU coreutils):
tail -F file-that-does-not-exist
От man tail
:
-F same as --follow=name --retry
--retry
keep trying to open a file even when it is or becomes inaccessi‐
ble; useful when following by name, i.e., with --follow=name
-f, --follow[={name|descriptor}]
output appended data as the file grows; -f, --follow, and --fol‐
low=descriptor are equivalent
Попробуйте это в vim
:
:g/BadFling/normal [{V]}d
:global
управляйте выполняет команду на всех строках, которые соответствуют шаблону (я использовал BadFling
как пример - корректируют его при необходимости). Команда, выполняемая в этом случае, :normal
команда, которая выполняет нормальные команды режима. Цель этого состоит в том, чтобы использовать питание [{
и ]}
vim
команды перемещения, которые перемещаются между парами фигурной скобки. Vd
комбинация, используется, чтобы сделать, linewise удаляет. Это не столь устойчиво как синтаксический анализатор JSON, но работы, предполагающие что каждый "blah1"
часть содержится в ее собственном наборе строк и таким образом, linewise удаляет, случайно не удалит ничего, что принадлежит другому блоку. Например, linewise удаляют подход, не работал бы, если бы у Вас было что-то как
... end of block you want to keep
}, "blah1" : {
block you want removed
}, "blah2" : {
start of block you want to keep ...
}
Кроме того, [{
только использует блок непосредственного родителя поэтому, если у Вас будут дальнейшие уровни вложения, то это также не будет работать.
Можно сделать это с grep
и diff
, если Ваша версия diff
является достаточно недавним:
ire@localhost$ grep -B 3 -A 2 BadFling1 huge.json | diff --changed-group-format="%>" --unchanged-group-format="" - huge.json
{
"bla2": {
"Part1": "Plop1",
"Part2": "Plop2",
"Part3": "<stuff>",
"part4": "Plop4",
},
// etc for many more entries
}
grep
вытаскивает плохие записи, путем извлечения строк, окружающих соответствие. diff
удаляет их из оригинала. Как упомянуто в комментариях, это решение требует, чтобы размеры блока были последовательны, и согласующий отрезок длинной линии, чтобы быть в том же месте в каждом блоке (как в Вашем примере).
Если бы это не имело место (варьирующийся рекордный размер или ненадежное расположение рекордных элементов), то я взял бы это в качестве сигнала для записи быстрого сценария парсинга. Можно легко и безопасно удалить эти записи только с несколькими строками Python, который имеет встроенный синтаксический анализатор JSON.
Вот решение в awk:
awk '/".*":\ {/ { open=line; skip_block=0 }
/"Part3":\ "BadFling1/ { skip_block=1 }
/},/ { if (skip_block) { line=open; next } }
{ lines[line++]=$0 }
END { for (i=0;i<=line;i++) { print lines[i] } }' yourfile > clean
Это очень хорошо не тестируется, но это должно запустить Вас. Это будет работать, даже если блоки будут иметь переменную длину, и не заботится, где в блоке строка дисквалификации расположена.
Объяснение:
строка 1: если строка соответствует запуску блока, отметьте положение в массиве, отметьте блок как хороший до сих пор
строка 2: если строка соответствует строке дисквалификации, и отметьте блок
строка 3: соответствуйте концу блока. если блок отмечен, сбросьте положение в массиве туда, где блок, запущенный, и пропуск к следующей строке
строка 4: добавьте текущую строку, чтобы выстроить и увеличить счетчик строки
строка 5: когда сделано читая файл, распечатайте массив, содержа только "хорошие" блоки
Можно реализовать то же самое в ударе, но awk будет намного быстрее, и по-моему это - вид вещей awk, создается для, не имея необходимость вытаскивать "более тяжелый" язык.
использование энергии:
:%s/BadFling1//g
будет искать все случаи "BadFling1" и заменять его "".
a{
/a}
/aB
“a{}
- разграниченный блок”. С ним команда нормального режима могла бытьda{dd
(удалите содержание{}
блок, затем остающееся"key": ,
строка); это имеет тот же эффект, как Ваш визуальный режим управляет, но избегает использования самого визуального режима. – Chris Johnsen 18.12.2012, 05:39{}
блок, если такой блок существовал (вероятно, не). – jw013 18.12.2012, 07:16