Удалите большие блоки из json использование энергии

Используйте -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
3
17.12.2012, 22:24
4 ответа

Попробуйте это в 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 ...
}

Кроме того, [{ только использует блок непосредственного родителя поэтому, если у Вас будут дальнейшие уровни вложения, то это также не будет работать.

5
27.01.2020, 21:11
  • 1
    Существует также текстовый объект, который мог быть удобным для этого (например, постараться не ударять предыдущий визуальный выбор): a{/a}/aB “a {}- разграниченный блок”. С ним команда нормального режима могла быть da{dd (удалите содержание {} блок, затем остающееся "key": , строка); это имеет тот же эффект, как Ваш визуальный режим управляет, но избегает использования самого визуального режима. –  Chris Johnsen 18.12.2012, 05:39
  • 2
    @ChrisJohnsen Да, который работал бы. Причина я не использовал его, состоит в том, потому что это имеет риск удаления дополнительной строки, когда существует пустое {} блок, если такой блок существовал (вероятно, не). –  jw013 18.12.2012, 07:16

Можно сделать это с 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.

2
27.01.2020, 21:11
  • 1
    Это - умный и новый подход. Необходимо упомянуть, что это требует, чтобы смещение строки строки шаблона было последовательно в ее "блоке" все же. –  jw013 17.12.2012, 23:19
  • 2
    @jw013 - Спасибо. Я развернул объяснение для создания моих предположений более ясными. спасибо –  ire_and_curses 17.12.2012, 23:30

Вот решение в 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, создается для, не имея необходимость вытаскивать "более тяжелый" язык.

1
27.01.2020, 21:11

использование энергии:

:%s/BadFling1//g

будет искать все случаи "BadFling1" и заменять его "".

0
27.01.2020, 21:11
  • 1
    Он хочет всю окружающую удаленную запись, не только строка. –  ire_and_curses 17.12.2012, 22:53

Теги

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