Làm thế nào để màu sắc đầu ra khác nhau?


18

Tôi muốn định dạng các tệp Unix một cách có điều kiện, tôi hiện đang làm việc trên difflệnh và muốn biết liệu có thể định dạng văn bản của diffđầu ra lệnh hay không.

Thí dụ:

Các giá trị phù hợp sẽ được hiển thị bằng màu xanh lá cây.
Các giá trị chưa từng có sẽ được hiển thị bằng màu đỏ.

Giả sử tôi có hai tệp file1file2lệnh của tôi là diff file1 file2.

Bây giờ tôi muốn rằng đầu ra giả sử chứa 5 không khớp thì những điểm không khớp đó sẽ được hiển thị bằng màu Đỏ. Làm thế nào để đạt được điều này bằng cách sử dụng unix?

Tóm lại "Thay đổi màu thành màu đỏ cho đầu ra của lệnh diff cho các giá trị không khớp"


2
Bản sao có thể có của điều này
FloHimelf

Các thuật ngữ "khớp" và "không phù hợp" hơi khó hiểu. Dù sao, bây giờ có tùy chọn --color trong diff 3,4 trở lên.
Gerry Lufwansa

Câu trả lời:


23

diff --color tùy chọn đã được thêm GNU diffutils 3.4 (2016-08-08)

Đây là difftriển khai mặc định trên hầu hết các bản phát hành, sẽ sớm nhận được nó.

Trên 3.5, nó trông như thế này:

nhập mô tả hình ảnh ở đây

với:

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

Tôi cũng đã yêu cầu mức độ từ khác nhau từ diff-highlight: [Diffutils-devel] Thêm một cờ để tạo đầu ra có màu như git's diff-h | liệt kê.gnu.org

Rõ ràng đã thêm vào cam kết c0fa19fe92da71404f809aafb5f51cfd99b1bee2 (tháng 3 năm 2015).


1
Thông minh! Để bật tính năng này theo mặc định: alias diff='diff --color=auto'
Tom Hale

1
Đây là tài liệu.
Alexey

19

Nếu bạn có quyền truy cập vào GNU, diffbạn có thể sử dụng các --X-group-formattùy chọn của nó để có được hiệu ứng đó mà không cần bất kỳ công cụ bổ sung nào:

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

Điều đó sử dụng mã thoát màu ANSI để có màu đỏ và xanh lục, với trích dẫn ANSI-C trong trình bao để truy cập các \elối thoát.

--old-group-format--new-group-formatxác định các dòng không khớp và chèn chúng giữa các mã đặt lại màu đỏ và màu bằng cách sử dụng %<%>, trong khi --unchanged-group-formatchèn các dòng khớp giữa mã màu lục và mã đặt lại.

Bạn cũng có thể sử dụng--old-line-format (vv), với chi phí thoát màu dư thừa trên mỗi dòng : --old-line-format=$'\e[0;31m%L\e[0m'.


Khi tôi chạy, nó cung cấp cho diff: 0653-821 tùy chọn bất hợp pháp - - diff: 0653-821 tùy chọn bất hợp pháp - o diff: 0653-821 tùy chọn bất hợp pháp - d diff: 0653-821 tùy chọn bất hợp pháp - - diff: 0653-821 tùy chọn bất hợp pháp - g diff: 0653-821 tùy chọn bất hợp pháp - o like lỗi.
Aman

Hormer khi tôi đang chạy các lệnh của bạn theo từng dòng một, nó đang đưa ra dòng mới không có đầu ra -bash-4.2 $ --new-group-format = $ '\ e [0; 31m%> \ e [0m' \ >
Aman

Tôi có thể cấu hình nó theo mặc định?
Eugen Konkov

@EugenKonkov Bạn có thể thiết lập bí danh hoặc hàm trong trình bao của mình để chạy nó cho diff.
Michael Homer

Điều này đã cho tôi một chút rắc rối khi cố gắng làm cho nó hoạt động. Những thứ không thay đổi được hiển thị khi được thêm vào ... đã từ bỏ và cài đặt colordiff
Brian Peterson

9

Thử colordiff file1 file2

Tính khả dụng của colordiff với bản phân phối Linux / BSD của bạn

Những người đang chạy Debian hoặc Ubuntu (hoặc bất kỳ dẫn xuất nào của họ) có thể chỉ cần sử dụng "apt-get install colordiff" để tải xuống và cài đặt; colordiff cũng được đóng gói cho một số hệ điều hành và phân phối Linux, UNIX và BSD khác.

(Trích dẫn từ http://www.colordiff.org/ )


1
Hoàn hảo. Đối với tôi, diff --color=autochỉ là đánh dấu dòng màu và dòng đầu tiên của mỗi +/ -phần. Đường ống để less -SRlàm cho trình duyệt dễ dàng.
Walf

4

Màu, từ cấp diff ouput

Đây là những gì bạn có thể làm với đoạn script bên dưới và diff-highlight :

Ảnh chụp màn hình khác màu

#!/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

(Tín dụng cho câu trả lời của @ retracile cho phần sedtô sáng)


1

Bạn nên xem hllệnh có sẵn trên github: git clone http://github.com/mbornet-hl/hl và trên: http://www.flashnux.com/notes/page_000022_US.html

hllà một lệnh Linux được viết bằng C, đặc biệt được thiết kế để tô màu tệp văn bản hoặc đầu ra của lệnh. Bạn có thể sử dụng đồng thời tối đa 42 màu và sử dụng tệp cấu hình để đơn giản hóa các dòng lệnh. Bạn có thể tô màu đầu ra của mỗi lệnh có thể được chuyển sang lệnh khác. Và nếu bạn biết biểu thức chính quy là gì, nó sẽ rất dễ sử dụng. Bạn có thể sử dụng mantrang để hiểu cách sử dụng nó.
hlrất dễ sử dụng và cấu hình. Bạn thậm chí có thể sử dụng tập lệnh hl_generic để tô màu đầu ra lệnh mà không sửa đổi cú pháp của chúng.
Bạn có thể, ví dụ, tô màu đầu ra của difflệnh chỉ bằng cách gõ lệnh thông thường của bạn:

diff file1 file2

Nếu bạn cần giúp đỡ, chỉ cần gửi cho tôi một e-mail.
Trân trọng.


1

Có một công cụ thực sự gọn gàng được xây dựng với python trên Github tại thời điểm được gọi icdiff. Tạo ra các kết quả đầu ra có màu đẹp, cũng được nhận biết là nghiêm trọng. Tôi sử dụng nó mọi lúc, cũng đáng để kiểm tra.


0

Hoặc bạn có thể sử dụng

1.diff --color=auto file1 file2

2.colordiff file1 file2

3. My Favorites: git diff file1 file2thực hiện như sau:

Tôi hiện đang sử dụng và khuyến nghị là , bằng cách sử dụng git diff hoặc đường ống đầu ra của nó colordiffbằng cách sử dụng:

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


Tôi cũng thích git diff --no-indexnhưng tôi nghĩ các tập tin cần phải được tìm kiếm. (Ít nhất, không hoạt động với thay thế quy trình bash cho tôi)
Karl

@Karl Hãy tự mình tìm ra một phần, có thể có một thiết lập Terminal thực hiện (hoặc) một số cách khác để làm cho nó có thể tìm kiếm được. Tôi đã sử dụng git difftừ lâu và tập tin có thể tìm kiếm được cho tôi, nếu không tôi sẽ không sử dụng đúng cách.
himanshuxd

2
Có lẽ tôi đã không rõ ràng rất rõ ràng. Như một ví dụ (ngớ ngẩn), điều này làm việc cho tôi diff --color <(ls | head -n+3) <(ls | tail -n +5)nhưng không phải với git diff. Phải thừa nhận rằng, không phải là một trường hợp phổ biến hoặc quá khó để làm việc xung quanh.
Karl

0

Chỉ cần một lưu ý: để có được đầu ra "bên cạnh" bạn cần "--color = always". Bạn cũng có thể phân trang nó với ít hơn và giữ lại đầu ra màu:

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

Và một gợi ý khác: cố gắng giữ công tắc "--color = always" ở cuối. Lý do? Với dmesg từ produc-linux 2.27.1:

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

0

Kịch bản lệnh này sử dụng khác biệt chuẩn 3,4 phiên bản trước (nó sẽ hoạt động với mọi phiên bản khác nhau) và tô màu đầu ra mà không thay đổi định dạng đầu ra theo bất kỳ cách nào. Nó hoạt động với phiên bản mới nhất của RHEL (phiên bản 7.5) có phiên bản GNU diff 3.3. Chỉ cần đặt nó trong thư mục ~ / bin của bạn hoặc bất cứ nơi nào khác trong đường dẫn của bạn (tôi khuyên bạn nên gọi nó là "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/"

0

nếu bạn đã cài đặt vim, bạn có thể làm diff file1 file2 | vim -

Vim sẽ nhận ra định dạng khác và cho nó màu phù hợp. Dấu gạch ngang ở cuối là để cho vim chấp nhận đầu vào từ lệnh diff.


'Chế độ xem' (lối tắt chỉ đọc đến vim) phù hợp hơn cho mục đích này.
Anupam Srivastava

0

Màu sắc cấp độ nhân vật: Cài đặt ccdiff

ccdiff -r /usr/share/dict/words /tmp/new-dict

Đầu ra của ccdiff

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.