Удалите ненужные строки контекста из вывода 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, поскольку вы сказали, что хотите этого.
Обратите внимание, что моя разница ставит !
как первый символ измененных строк, так что я также ищу это как немета-вывод.
Это может работать с разноцветным дифференциалом, если вы можете найти способ обмануть его, думая, что ваша труба может отображать экранирование цвета.