পাঠ্য ফাইলগুলির মধ্যে অক্ষর-স্তরের পার্থক্য পেতে 'ডিফ' (বা অন্য কিছু) ব্যবহার করা


93

চরিত্রের পার্থক্যের মধ্যে উভয়ই রেখার পার্থক্য পেতে আমি 'ডিফ' ব্যবহার করতে চাই। উদাহরণস্বরূপ, বিবেচনা করুন:

ফাইল 1

abcde
abc
abcccd

ফাইল 2

abcde
ab
abccc

ডিফ-ইউ ব্যবহার করে আমি পেয়েছি:

@@ -1,3 +1,3 @@
 abcde
-abc
-abcccd
\ No newline at end of file
+ab
+abccc
\ No newline at end of file

তবে এটি কেবল আমাকে দেখায় যে এই লাইনে পরিবর্তন ছিল। আমি যা দেখতে চাই তা হ'ল:

@@ -1,3 +1,3 @@
 abcde
-ab<ins>c</ins>
-abccc<ins>d</ins>
\ No newline at end of file
+ab
+abccc
\ No newline at end of file

তুমি আমার বামনা পেতে।

এখন, আমি জানি যে আমি একটি নির্দিষ্ট লাইনের পার্থক্য চিহ্নিত / পরীক্ষা করতে অন্যান্য ইঞ্জিনগুলি ব্যবহার করতে পারি । তবে আমি বরং একটি সরঞ্জাম ব্যবহার করব যা এটি সব করে।


4
প্রতি চর ডিফ বিশেষত কার্যকর যখন এটি সিজেকে পাঠ্যের ক্ষেত্রে আসে, যেখানে শব্দ বিভাজনের জন্য কোনও শ্বেত স্পেস প্রয়োগ করা হয় না।
友情 留 在 无 盐

উত্তর:


77

গিটের একটি শব্দের পার্থক্য রয়েছে এবং সমস্ত অক্ষরকে শব্দ হিসাবে কার্যকরভাবে সংজ্ঞায়িত করা আপনাকে একটি চরিত্রের পার্থক্য দেয়। তবে নতুন লাইনের পরিবর্তনগুলি উপেক্ষা করা হয়

উদাহরণ

এটির মতো একটি সংগ্রহস্থল তৈরি করুন:

mkdir chardifftest
cd chardifftest
git init
echo -e 'foobarbaz\ncatdog\nfox' > file
git add -A; git commit -m 1
echo -e 'fuobArbas\ncat\ndogfox' > file
git add -A; git commit -m 2

এখন, করুন git diff --word-diff=color --word-diff-regex=. master^ masterএবং আপনি পাবেন:

গিট বিভিন্ন

অক্ষর স্তরে সংযোজন এবং মুছে ফেলা উভয়কে কীভাবে স্বীকৃতি দেওয়া হয়েছে তা নোট করুন, অন্যদিকে নতুন লাইনগুলির সংযোজন এবং মোছা উভয়ই উপেক্ষা করা হবে।

আপনি এর মধ্যে একটি চেষ্টা করতেও পারেন:

git diff --word-diff=plain --word-diff-regex=. master^ master
git diff --word-diff=porcelain --word-diff-regex=. master^ master

78
আপনার কোনও রেপো তৈরি করার দরকার নেই, আপনি কেবল আপনার ফাইল সিস্টেমের যে কোনও জায়গায় গিট ডিফ দিতে পারেন এবং এটি কার্যকর হয় works আপনার আদেশ আমার পক্ষে সেভাবে দুর্দান্ত কাজ করে, তাই ধন্যবাদ! git diff --word-diff=color --word-diff-regex=. file1 file2
qwertzguy

4
এটি গভীরভাবে সহায়ক! আমি একবার যদি সফ্টওয়্যার বিকাশকারী হিসাবে +1 এবং লেখক / লেখক হিসাবে আরও +1 করতাম। কোডের বিপরীতে, যেখানে লাইনগুলি যুক্তিযুক্তভাবে সংক্ষিপ্ত হতে থাকে, যখন কাগজপত্র / গল্প লেখার সময় প্রতিটি অনুচ্ছেদে একটি দীর্ঘ শব্দ-মোড়ানো লাইনের রূপ নেয়, এবং এই বৈশিষ্ট্যটি প্রকৃতপক্ষে দৃষ্টিভঙ্গি করে তোলে।
mtraceur

30
--no-indexগিট রেপোর বাইরে এটি আমার জন্য কাজ করার জন্য উপরের দিকে আমার @ কিওয়ার্টজগুয়েসের প্রতিক্রিয়া যুক্ত করা দরকার । সুতরাং:git diff --no-index --word-diff=color --word-diff-regex=. file1 file2
নাথান বেল

4
গিট ডিফটি সাধারণ সেটিংয়ে কাজ করে না: গিট ডিফ - নন-ইনডেক্স - ওয়ার্ড-ডিফ = কালার - ওয়ার্ড-ডিফফ-রেজেক্স =। <(ইকো স্ট্রিং 1) <(প্রতিধ্বনি স্ট্রিং 2) .. কিছুই নয়, তবে এটি কাজ করে: ডিফ - কালার <(ইকো স্ট্রিং 1) <(প্রতিধ্বনি স্ট্রিং 2)।
মোশ

4
@ নাথানবেল আমারও --no-indexএকটি রেপোর ভিতরে যোগ করার দরকার ছিল
জেস্টোর হাউজ

32

তুমি ব্যবহার করতে পার:

diff -u f1 f2 |colordiff |diff-highlight

স্ক্রিনশট

colordiffএকটি উবুন্টু প্যাকেজ। আপনি এটি ব্যবহার করে ইনস্টল করতে পারেন sudo apt-get install colordiff

diff-highlightগিট থেকে (সংস্করণ ২.৯ থেকে) এটি অবস্থিত /usr/share/doc/git/contrib/diff-highlight/diff-highlight। আপনি এটি আপনার কোথাও রাখতে পারেন $PATH


6
কলর্ডিফ ম্যাকের জন্য হোমব্রুতেও উপলভ্য:brew install colordiff
এমিল স্টেনস্ট্রোম

4
Mac এ আপনি জানতে পারেন diff-highlight$(brew --prefix git)/share/git-core/contrib/diff-highlight/diff-highlight
StefanoP

4
যদি আপনি ব্রিউ ব্যবহার করে গিট ইনস্টল করেন না - diff-highlightপাইথনের পাইপের সাহায্যেও ইনস্টল করা যেতে পারে - pip install diff-highlight(
গিটটি ব্রুয়ের

22

আপনি যদি প্রোগ্রামটিভভাবে এটি করতে চান তবে পাইথনের ডিসফ্লিবটি এস is ইন্টারেক্টিভ ব্যবহারের জন্য, আমি ভিমের ডিফ মোড ব্যবহার করি (ব্যবহারের পক্ষে যথেষ্ট সহজ: কেবলমাত্র ভিমের সাথে অনুরোধ করব vimdiff a b)। আমি মাঝে মাঝে তুলনার বাইরেও ব্যবহার করি , যা আপনি কোনও ভিন্ন সরঞ্জাম থেকে আশা করতে পারেন এমন অনেক কিছুই করে।

আমি কোনও কমান্ড লাইন সরঞ্জাম দেখিনি যা এটি কার্যকরভাবে করে, কিন্তু উইল নোট হিসাবে, ডিফ্লিবল উদাহরণ কোড সাহায্য করতে পারে।


4
ওহ .. আমি আরও কিছু প্রমিতের (একটি লুকানো কমান্ড লাইন আর্গুমেন্টের মতো) আশা করছিলাম। সবচেয়ে জঘন্য বিষয়টি আমার কাছে তুলনা 2 ছাড়িয়ে রয়েছে এবং এটি এমনকি পাঠ্য আউটপুটটিকে ডিফের ফাইল / কনসোল সমর্থন করে তবে এটি এখনও কেবল লাইন-ডিফগুলি অন্তর্ভুক্ত করে এবং চরফরফগুলি অন্তর্ভুক্ত করে না। কারও কাছে কিছু না থাকলে অজগরটিকে দেখব।
ভাইটালিবি

6
আমাকে ভিমডিফের সাথে পরিচয় করিয়ে দেওয়ার জন্য +1। আমি ডিফল্ট রঙগুলি অপঠনযোগ্য হিসাবে খুঁজে পেয়েছি, তবে এর জন্য স্ট্যাকওভারফ্লো . com/ প্রশ্নস / 28২৮১/২ এ সমাধান পেয়েছি ।
undefined

18

আপনি cmpসোলারিসে কমান্ডটি ব্যবহার করতে পারেন :

cmp

দুটি ফাইলের তুলনা করুন, এবং যদি সেগুলির মধ্যে পার্থক্য থাকে তবে প্রথম বাইট এবং লাইন নম্বরটি যেখানে তারা পৃথক রয়েছে তা জানিয়ে দেয়।


4
cmpলিনাক্স বিতরণে (অন্তত কিছু) উপলব্ধ।
জেফ ইভান্স

7
এটি ম্যাক ওএস এক্স
এরিক আর রথ

অক্ষরগুলি একাধিক বাইট সমন্বয়ে গঠিত হতে পারে এবং ওপি একটি চাক্ষুষ তুলনা চেয়েছিল।
সিস টিমারম্যান

4
@ চিজটিম্মারম্যান: সিএমপি ফ্ল্যাজের সাথে ভিজ্যুয়াল তুলনার অনুমতি দেয় -l -b
স্মার

10

পাইথনের সুবিধাজনক লাইব্রেরি রয়েছে difflibযা আপনার প্রশ্নের উত্তর দিতে সহায়তা করতে পারে।

নীচে দুটি difflibপাইথন সংস্করণ ব্যবহার করে দু'জন অন্নিলার রয়েছে।

python3 -c 'import difflib, sys; \
  print("".join( \
    difflib.ndiff( \ 
      open(sys.argv[1]).readlines(),open(sys.argv[2]).readlines())))'
python2 -c 'import difflib, sys; \
  print "".join( \
    difflib.ndiff( \
      open(sys.argv[1]).readlines(), open(sys.argv[2]).readlines()))'

এই একটি শেল ওরফে যা আপনার সঙ্গে প্রায় সরাতে সহজ হিসাবে উপকারে আসতে পারে .${SHELL_NAME}rc

$ alias char_diff="python2 -c 'import difflib, sys; print \"\".join(difflib.ndiff(open(sys.argv[1]).readlines(), open(sys.argv[2]).readlines()))'"
$ char_diff old_file new_file

এবং আরও পাঠযোগ্য সংস্করণ একটি স্ট্যান্ডেলোন ফাইলে রাখার জন্য।

#!/usr/bin/env python2
from __future__ import with_statement

import difflib
import sys

with open(sys.argv[1]) as old_f, open(sys.argv[2]) as new_f:
    old_lines, new_lines = old_f.readlines(), new_f.readlines()
diff = difflib.ndiff(old_lines, new_lines)
print ''.join(diff)

দুর্দান্ত এক লাইনার কনডেন্সড আউটপুট যা অপরিবর্তিত রেখাগুলি উপেক্ষা করে ভাল লাগবে।
aidan.plenert.macdonal

6
cmp -l file1 file2 | wc

আমার জন্য ভাল কাজ করেছে। ফলাফলের বামতম সংখ্যাটি পৃথক পৃথক অক্ষরের সংখ্যা নির্দেশ করে।


4
বা কেবল বামতম নম্বর পেতে:cmp -l file1 file2 | wc -l
টনি

5

দীর্ঘতম সাধারণ উপসর্গ অ্যালগরিদম ব্যবহার করে এই সমস্যাটি সমাধান করার জন্য আমি আমার নিজস্ব স্ক্রিপ্টও লিখেছি

এটি যেমন কার্যকর করা হয়

JLDiff.py a.txt b.txt out.html

ফলাফলটি এইচটিএমএলে লাল এবং সবুজ বর্ণের সাথে। বৃহত্তর ফাইলগুলি প্রক্রিয়াজাতকরণের জন্য দীর্ঘ সময় ব্যয় করে তবে এটি প্রথম লাইনে লাইন পরীক্ষা না করে অক্ষর তুলনা করে সত্য চরিত্রটি করে।


আমি খুঁজে পেয়েছি যে জেডিডিফ পাইপির নিচে অনেক দ্রুত চলে runs
জোশুয়া

4

রঙিন, চরিত্রের স্তরের diff আউটপুট

নীচের স্ক্রিপ্ট এবং ডিফ-হাইলাইট (যা গিটের একটি অংশ) দিয়ে আপনি কী করতে পারেন তা এখানে :

রঙিন ডিফ স্ক্রিনশট

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

(ক্রেডিট @ retracile এর উত্তর জন্য sedহাইলাইট)


এটি শেল স্ক্রিনে ভাল পার্থক্য দেখায়, তবে আমি কীভাবে জিভিমে এই পার্থক্যটি দেখতে পাবো ??
হেমন্ত শর্মা

4
এটি আসলেই একটি জিভিএম প্রশ্ন :)। command | gvim -আপনি যা চান তা করবে
এট রিগ

রেফারেন্সের জন্য ভিন্ন-হাইলাইট অংশ হিসাবে অন্তর্ভুক্ত বলে মনে হয় gitতবে আপনার পথে রাখেনি। আমার মেশিনটিতে এটি বাস করে /usr/share/doc/git/contrib/diff-highlight
এট রিগ

ছিন্ন সুত্র. আমি কীভাবে ডিফ-হাইলাইট ইনস্টল করব। প্যাকেজ পরিচালকের মধ্যে নেই বলে মনে হচ্ছে।
ট্রেভর হিকি

3

পাইথনের ডিসফ্লিব এটি করতে পারে।

ডকুমেন্টেশনে আপনার জন্য একটি উদাহরণ কমান্ড-লাইন প্রোগ্রাম অন্তর্ভুক্ত রয়েছে ।

সঠিক ফর্ম্যাটটি আপনি যেমন নির্দিষ্ট করেছেন তেমন নয়, তবে এটি এনডিফ-স্টাইলের আউটপুটকে পার্স করা বা আপনার স্বরলিপি তৈরির জন্য উদাহরণ প্রোগ্রামটি পরিবর্তন করা সোজা হবে।


ধন্যবাদ! আমি এটার দিকে নজর রাখব. আমি আরও কিছু প্রমিতের (একটি লুকানো কমান্ড লাইন আর্গুমেন্টের মতো) আশা করছিলাম। তবে এটি এখনও ভাল করতে পারে। কারও কাছে আরও কিছু স্ট্যান্ডার্ড না থাকলে আমি অজগরটিকে দেখব (যদিও এটি মনে হয় না)।
ভাইটালিবি

2

এখানে একটি অনলাইন পাঠ্য তুলনা সরঞ্জাম: http://text-compare.com/

এটি প্রতিটি একক চরকে আলাদা করতে পারে এবং বাকিগুলির সাথে তুলনা চালিয়ে যেতে পারে।


এটি একক অক্ষরের কোনও বিকল্প না করেই লাইন-লেভেলের ডিফার্স করে। আপনি কীভাবে এটি অক্ষরের সাথে তুলনা করতে পারেন?
ড্রাগন

আহ; এটি বিভিন্ন চরিত্রগুলি হাইলাইট করে। কিন্তু এটি এখনও যে লাইন-স্তর নেই catdogএবং cat\ndogশুধুমাত্র ম্যাচ হবেcat
ড্রাগন

1

আমি মনে করি সহজ সমাধানটি সর্বদা একটি ভাল সমাধান। আমার ক্ষেত্রে, নীচের কোডটি আমাকে অনেক সহায়তা করে। আমি আশা করি এটি অন্য কাউকে সহায়তা করে।

#!/bin/env python

def readfile( fileName ):
    f = open( fileName )
    c = f.read()
    f.close()
    return c

def diff( s1, s2 ):
    counter=0
    for ch1, ch2 in zip( s1, s2 ):
        if not ch1 == ch2:
            break
        counter+=1
    return counter < len( s1 ) and counter or -1

import sys

f1 = readfile( sys.argv[1] )
f2 = readfile( sys.argv[2] )
pos = diff( f1, f2 )
end = pos+200

if pos >= 0:
    print "Different at:", pos
    print ">", f1[pos:end]
    print "<", f2[pos:end]

আপনি আপনার প্রিয় টার্মিনালে নিম্নলিখিত সিনট্যাক্সের সাথে দুটি ফাইলের তুলনা করতে পারেন:

$ ./diff.py fileNumber1 fileNumber2

0

আপনি যদি নিজের ফাইলগুলিকে গিতে রাখেন তবে আপনি ডিফ-হাইলাইট স্ক্রিপ্টের সাথে সংস্করণগুলির মধ্যে পার্থক্য করতে পারেন , যা বিভিন্ন লাইন প্রদর্শন করবে, পার্থক্য হাইলাইট করে।

দুর্ভাগ্যক্রমে এটি তখনই কার্যকর হয় যখন সরানো রেখার সংখ্যা যুক্ত হওয়া লাইনের সংখ্যার সাথে মেলে - যখন লাইনগুলি মেলে না তার জন্য স্টাব কোড রয়েছে, সম্ভবত এটি ভবিষ্যতে ঠিক করা যেতে পারে।


0

একটি সম্পূর্ণ উত্তর নয়, তবে যদি cmp -lআউটপুট যথেষ্ট পরিষ্কার না হয় তবে আপনি ব্যবহার করতে পারেন:

sed 's/\(.\)/\1\n/g' file1 > file1.vertical
sed 's/\(.\)/\1\n/g' file2 > file2.vertical
diff file1.vertical file2.vertical

ওএসএক্সে `` `সেড 's / (।) / \ 1 \' $ '\ n / g' file1> file1.versical সেড 's / \ (। \) / \ 1 \' $ '\ n / জি ব্যবহার করুন 'file2> file2.vertical `` `
mmacvicar

0

এই উত্তরগুলির বেশিরভাগটিতে ডিফ-হাইলাইট ব্যবহারের উল্লেখ রয়েছে পার্ল মডিউল । তবে আমি পার্ল মডিউলটি কীভাবে ইনস্টল করব তা নির্ধারণ করতে চাইনি। সুতরাং আমি এটিতে স্বাবলম্বিত পার্ল স্ক্রিপ্ট হওয়ার জন্য কিছুটা ছোটখাটো পরিবর্তন করেছি।

আপনি এটি ব্যবহার করে এটি ইনস্টল করতে পারেন:

▶ curl -o /usr/local/bin/DiffHighlight.pl \
   https://raw.githubusercontent.com/alexharv074/scripts/master/DiffHighlight.pl

এবং ব্যবহার (যদি আপনার উবুন্টু colordiffঝ্যাঙ্কসউ-র উত্তরে উল্লিখিত থাকে):

▶ diff -u f1 f2 | colordiff | DiffHighlight.pl

এবং ব্যবহার (যদি আপনি না করেন):

▶ diff -u f1 f2 | DiffHighlight.pl

0

সিসিডিফ কাজের জন্য একটি সুবিধাজনক ডেডিকেটেড টুল। আপনার উদাহরণটি দেখতে এটির মতো দেখাচ্ছে:

সিসিডিফ উদাহরণ আউটপুট

ডিফল্টরূপে, এটি রঙের পার্থক্যগুলি হাইলাইট করে, তবে এটি রঙ সমর্থন ছাড়াই একটি কনসোলেও ব্যবহার করা যেতে পারে।

প্যাকেজটি দেবিয়ানর মূল ভান্ডারে অন্তর্ভুক্ত রয়েছে :

সিসিডিফ একটি রঙিন ডিফ যা পরিবর্তিত লাইনের অভ্যন্তরেও রঙ করে।

সমস্ত ফাইল-কমান্ড-লাইন সরঞ্জামগুলি যে দুটি ফাইলের মধ্যে পার্থক্য দেখায় ছোটখাটো পরিবর্তন দৃশ্যমানভাবে কার্যকর দেখায় showing সিসিডিফ diff --colorবা colordiffবর্ণের বর্ণন বা অনুভূতি দেওয়ার চেষ্টা করে , তবে পরিবর্তিত লাইনের মধ্যে মুছে ফেলা এবং যুক্ত হওয়া অক্ষরের জন্য রঙিন মুছে ফেলা এবং বর্ণগুলিতে বর্ণযুক্ত আউটপুট প্রদর্শন প্রসারিত করে।


দেখতে দেখতে দুর্দান্ত, তবে অ-দেবিয়ান সিস্টেমগুলির জন্য ইনস্টল করার উপযুক্ত নির্দেশাবলীর অভাব রয়েছে।
জেরুস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.