Удалите ненужные строки контекста из вывода diff (используя sed)

Я получил вклад от diff несколько файлов. Эти файлы содержат блоки информации длиной в 4 строки, разделенные пустыми строками, иногда 1-3 строки могут отличаться.

Я звоню diff с параметром -c3 потому что мне нужен контекст вокруг разных строк, чтобы получить полный информационный блок, так как сама строка ничего не стоит.

Из-за этого мой вывод становится действительно загроможденным и трудным для чтения. Поэтому я ищу способ обрезать контекстные строки, которые не принадлежат разным блокам.

Образцы входных файлов:

Port-configuration of Switch "HP_e5412zl_secondary"
Timestamp: 20140206-161001

Interface:      A1
Description:    Uplink to primary switch
VLAN Untagged:  2
VLANs Tagged:   1 23 42 103 169

Interface:      A2
Description:    -- Not set --
VLAN Untagged:  30
VLANs Tagged:   

Interface:      A3
Description:    WS-198
VLAN Untagged:  1
VLANs Tagged:   

Interface:      A4
Description:    -- Not set --
VLAN Untagged:  30
VLANs Tagged:   

Interface:      A5
Description:    Printer finances
VLAN Untagged:  30
VLANs Tagged: 

Для воспроизведения моего сценария, пожалуйста, используйте это и просто измените некоторые случайные строки.

Когда я бегу diff -c3 на двух разных файлах я получаю что-то вроде этого:

*** 2014-02-06/HP_e5412zl_secondary.txt   2014-02-06 16:14:38.024112434 +0100
--- 2014-02-05/HP_e5412zl_secondary.txt   2014-02-05 16:14:27.415741855 +0100
***************
*** 246,255 ****
  VLAN Untagged:        1
  VLANs Tagged:

  Interface:      A4
  Description:    -- Not set --
  VLAN Untagged:  30
  VLANs Tagged:   

  Interface:      A5
  Description:    Printer finances
--- 245,254 ----
  VLAN Untagged:        1
  VLANs Tagged:

  Interface:      A4
  Description:    WS-211
  VLAN Untagged:  1
  VLANs Tagged:   

  Interface:      A5
  Description:    Printer finances
***************
...

Я попробовал свои лучшие уловки, но не смог выделить нужную мне информацию из контекстного беспорядка. Желаемый результат будет выглядеть так:

*** 2014-02-06/HP_e5412zl_secondary.txt   2014-02-06 16:14:38.024112434 +0100
--- 2014-02-05/HP_e5412zl_secondary.txt   2014-02-05 16:14:27.415741855 +0100
***************
*** 246,255 ****

  Interface:      A4
  Description:    -- Not set --
  VLAN Untagged:  30
  VLANs Tagged:   

--- 245,254 ----

  Interface:      A4
  Description:    WS-211
  VLAN Untagged:  1
  VLANs Tagged:   

***************
...

-> Хотя мне даже не понадобятся строки, содержащие номера строк. Простого разделителя будет достаточно.

Я попробовал это:

diff -c3 file1 file2 | sed -n '/^[ ]*Inter.*/,/^[ ]*VLANs.*/p'

И это:

diff -c3 file1 file2 | sed -e '/^[*-]{3,}.*/,/^$/d'

Также я экспериментировал с * а также - персонажи, маскируя их \* или используя только один из. Использование их в масках и без масок с включающими скобками и без них - ничего не помогло.

Помогите? Пожалуйста?

Бонусный вопрос: я бы хотел сделать это с colordiff вместо diff. Это увеличит сложность (из-за встроенных цветовых кодов или чего-то еще)?

1 ответ

Решение

Если awk приемлем, вы можете использовать это:

awk '/^[^! ]/ {p = 1; print;}  /^ *$/ {if (p++ % 2 == 0) print;}  (p % 2 == 0) { print; }'

Объяснение:

  • На любом мета-выходе diff установите p=1 и распечатать строку
  • В любых пустых строках добавьте 1 к p, Распечатать строку, если p даже.
  • В противном случае выведите строку, если p даже.

Это даст желаемый результат, который вы предоставили. Обратите внимание, что это не подходит для обратной передачи в diff (потому что номера строк должны будут измениться), и все же содержит все мета-вещи diff, поскольку вы сказали, что хотите этого.

Обратите внимание, что моя разница ставит ! как первый символ измененных строк, так что я также ищу это как немета-вывод.

Это может работать с разноцветным дифференциалом, если вы можете найти способ обмануть его, думая, что ваша труба может отображать экранирование цвета.

Другие вопросы по тегам