Як кольоровий різний вихід?


18

Я хотів умовно відформатувати файли Unix, я зараз працюю над diffкомандою і хотів знати, чи можна форматувати текст diffвиводу команди.

Приклад:

Зіставлені значення повинні відображатися зеленим кольором.
Незрівняні значення повинні відображатися червоним кольором.

Припустимо , у мене є два файли file1і file2та моя команда diff file1 file2.

Тепер я хотів, щоб припустимо, що вихід містить 5 невідповідностей, то ці невідповідності повинні відображатися червоним кольором. Як цього досягти за допомогою unix?

Якщо коротко "Змінити колір на червоний для виведення команди diff для значень, які не відповідають"


2
Можливий дублікат цього
FloHimself

Терміни "матч" і "невідповідність" трохи заплутані. У будь-якому випадку, є варіант --color зараз у розрізненні 3.4 та пізніших версіях.
Геррі Луфванса

Відповіді:


24

diff --color додано опцію GNU diffutils 3.4 (08.08.2016)

Це diffреалізація за замовчуванням для більшості дистрибутивів, яка незабаром її отримує.

На 3.5 це виглядає приблизно так:

введіть тут опис зображення

з:

diff --color -u \
  <(seq 6 | sed 's/$/ a/') \
  <(seq 8 | grep -Ev '^(2|3)$' | sed 's/$/ a/')

Я також просив, щоб рівень слів відрізнявся від diff-highlightat: [Diffutils-devel] Додати прапор для отримання кольорового виводу, як git's diff-h | list.gnu.org

Мабуть, додано у комісії c0fa19fe92da71404f809aafb5f51cfd99b1bee2 (березень 2015 року).


1
Відмінно! Щоб увімкнути це за замовчуванням: alias diff='diff --color=auto'
Tom Hale

1
Ось документація.
Олексій

19

Якщо у вас є доступ до GNU, diffви можете використовувати його --X-group-formatпараметри для отримання цього ефекту без додаткових інструментів:

diff --old-group-format=$'\e[0;31m%<\e[0m' \
     --new-group-format=$'\e[0;31m%>\e[0m' \
     --unchanged-group-format=$'\e[0;32m%=\e[0m' \
     file1 file2

При цьому використовуються кольорові коди аварійних кольорів ANSI, щоб отримати червоний і зелений колір, з цитуванням ANSI-C в оболонці для доступу до \eевакуацій.

--old-group-formatі --new-group-formatідентифікуйте невідповідні лінії та вставляйте їх між червоними та кольоровими кодами скидання за допомогою %<та %>, в той час як --unchanged-group-formatвставляючи відповідні лінії між зеленими та скинутими кодами.

Ви можете також використовувати--old-line-format ( і т.д.), за рахунок надлишкових колірних пагонів в кожному рядку: --old-line-format=$'\e[0;31m%L\e[0m'.


коли я запускаю, це дає diff: 0653-821 незаконний варіант - - diff: 0653-821 незаконний варіант - o diff: 0653-821 незаконний варіант - d diff: 0653-821 незаконний варіант - - diff: 0653-821 нелегальний варіант - g розм .: 0653-821 незаконний варіант - o подібні помилки.
Аман

Гірмер, коли я запускаю ваші команди, як по одному рядку, він дає новий рядок не вихід -bash-4.2 $ - new-group-format = $ '\ e [0; 31m%> \ e [0m' \ >
Аман

Чи можу я налаштувати це за замовчуванням?
Євген Конков

@EugenKonkov Ви можете налаштувати псевдонім або функцію у своїй оболонці для запуску цього diff.
Майкл Гомер

Це доставило мені трохи проблем, намагаючись змусити його працювати. Незмінний матеріал з'являвся як додано ... здав і встановив colordiff
Брайан Петерсон

9

Спробуйте colordiff file1 file2

Наявність colordiff з вашим дистрибутивом Linux / BSD

Ті, хто працює з Debian або Ubuntu (або будь-якими їх похідними), ймовірно, можуть просто використовувати "apt-get install colordiff" для завантаження та встановлення; colordiff також упакований для ряду інших дистрибутивів Linux, UNIX та BSD та операційних систем.

(Цитата з http://www.colordiff.org/ )


1
Ідеально. Для мене diff --color=autoбули лише колоризуючі маркери ліній і перший рядок кожного +/ -розділу. Прокладка less -SRдозволяє легко переглядати.
Уолф

4

Кольорові, слово рівня diff Ouput

Ось що можна зробити із наведеним нижче сценарієм та розмежуванням розрізнень :

Кольоровий різний знімок екрана

#!/bin/sh -eu

# Use diff-highlight to show word-level differences

diff -U3 --minimal "$@" |
  sed 's/^-/\x1b[1;31m-/;s/^+/\x1b[1;32m+/;s/^@/\x1b[1;34m@/;s/$/\x1b[0m/' |
  diff-highlight

( Заслуговуйте на відповідь @ retcile за sedвиділення)


1

Ви повинні ознайомитись з hlкомандою, доступною на github: git clone http://github.com/mbornet-hl/hl та на: http://www.flashnux.com/notes/page_000022_US.html

hlце команда Linux, написана на C, спеціально призначена для забарвлення текстового файлу або виводу команди. Ви можете одночасно використовувати до 42 кольорів та використовувати файл конфігурації для спрощення командних рядків. Ви можете розфарбувати вихід кожної команди, яка може бути перенесена на іншу. І якщо ви знаєте, що таке регулярні вирази, вам це буде дуже просто використовувати. Ви можете використовувати manсторінку, щоб зрозуміти, як її використовувати.
hlдуже простий у використанні та налаштуваннях. Ви навіть можете використовувати скрипт hl_generic для розфарбовування результатів команд, не змінюючи їх синтаксис.
Наприклад, ви можете розфарбувати вихід diffкоманди, просто ввівши звичайну команду:

diff file1 file2

Якщо вам потрібна допомога, просто надішліть мені електронний лист.
З повагою


1

Наразі є справді акуратний інструмент, побудований з пітона на Github icdiff. Випускає красиві кольорові виходи, які також усвідомлюють "суворість". Я використовую його весь час, добре варто перевірити.


1

якщо у вас встановлений vim, ви можете це зробити diff file1 file2 | vim -

Vim розпізнає різний формат і надасть йому належне забарвлення. Тире в кінці означає, щоб vim прийняв введення з команди diff.


Для цього краще підійде "view" (ярлик для редагування лише для читання).
Анупам Срівастава


0

Або можна використовувати

1.diff --color=auto file1 file2

2.colordiff file1 file2

3.Моя улюблена: git diff file1 file2реалізована як нижче:

В даний час я використовую і рекомендую це або використовувати, git diff або з'єднувати його вихідні дані colordiffза допомогою:

diff() { git diff --no-index "$1" "$2" | colordiff; }


Мені git diff --no-indexтеж подобається, але я думаю, що файли потрібно шукати. (Принаймні, мені не підходить процес заміни баш-процесів)
Карл

@Karl Визначте, що розлучаєте самі, можливо, є налаштування терміналу, яке робить це (або) яким-небудь іншим способом зробити його шукаючим. Я використовую git diffдавно, і файл шукає для мене, інакше не було б користі, щоб я це робив правильно.
himanshuxd

2
Можливо, мені було не дуже ясно. Як (дурний) приклад, це працює для мене, diff --color <(ls | head -n+3) <(ls | tail -n +5)але не для git diff. Правда, це не звичайний випадок або занадто важкий спосіб обійти його.
Карл

0

Лише зауваження: для отримання результату "бічний бік" вам потрібен "--color = завжди". Ви також можете постраждати його менше і зберегти кольоровий вихід:

diff -y --color=always file1 file2 | less -R

І ще одна підказка: намагайтеся тримати перемикач "--color = завжди" в кінці. Причина? З dmesg від util-linux 2.27.1:

dmesg --human --color=always | less -R    # works
dmesg --color=always --human | less -R    # doesn't work

0

Цей скрипт використовує стандартну попередню версію 3.4 diff (вона повинна працювати з будь-якою версією diff) і колоризує вихід, не змінюючи формат виводу жодним чином. Він працює з останньою версією RHEL (версія 7.5), яка має GNU diff версії 3.3. Просто покладіть його у каталог ~ / bin або де-небудь ще на вашому шляху (я пропоную назвати його "cdiff").

#!/bin/bash
file1color="$(tput setaf 1)"
file2color="$(tput setaf 2)"
sepcolor="$(tput setaf 6)"
reset="$(tput sgr0)"
diff $* |sed -e "s/^\\(<.*\$\\)/$file1color\\1$reset/;s/^\\(>.*\$\\)/$file2color\\1$reset/;s/^\\(---\$\\)/$sepcolor\\1$reset/"

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.