Text Diff
दो टेक्स्ट को साथ-साथ रखकर तुलना करें और पंक्ति दर पंक्ति अंतर हाइलाइट करें
टेक्स्ट A
टेक्स्ट B
Text Diff क्या है?
Text diff ("difference" का संक्षिप्त रूप) दो पाठ खंडों की तुलना करने और यह पहचानने का परिणाम है कि कौन-सी पंक्तियाँ जोड़ी गईं, हटाई गईं, या अपरिवर्तित रहीं। यह अवधारणा Unix diff उपयोगिता से उत्पन्न हुई, जो पहली बार 1974 में Version 5 Unix के भाग के रूप में जारी की गई थी। आज, text diff, Git जैसी संस्करण नियंत्रण प्रणालियों की आधारशिला है, जहाँ प्रत्येक कमिट प्रत्येक फ़ाइल की पूर्ण प्रतिलिपि के बजाय एक diff संग्रहीत करता है।
एक diff एल्गोरिदम दो पंक्ति-अनुक्रमों के बीच Longest Common Subsequence (LCS) खोजता है। LCS में उपस्थित पंक्तियाँ अपरिवर्तित चिह्नित होती हैं। मूल पाठ में मौजूद लेकिन LCS में अनुपस्थित पंक्तियाँ हटाई गई चिह्नित होती हैं। संशोधित पाठ में मौजूद लेकिन LCS में अनुपस्थित पंक्तियाँ जोड़ी गई चिह्नित होती हैं। परिणाम वह न्यूनतम परिवर्तन-समूह है जो एक पाठ को दूसरे में रूपांतरित करने के लिए आवश्यक है।
Diff आउटपुट कई प्रारूपों में आता है। Unified diff (git diff का डिफ़ॉल्ट प्रारूप) हटाई गई पंक्तियों को माइनस चिह्न और जोड़ी गई पंक्तियों को प्लस चिह्न से चिह्नित करता है। Side-by-side diff दोनों पाठों को समानांतर स्तंभों में व्यवस्थित करता है। यह उपकरण रंग-कोडित आउटपुट के साथ पंक्ति-दर-पंक्ति तुलना करता है: जोड़े गए के लिए हरा, हटाए गए के लिए लाल, और अपरिवर्तित के लिए तटस्थ रंग। अपरिवर्तित पंक्तियाँ डिफ़ॉल्ट रूप से बिना किसी उपसर्ग के दिखाई देती हैं, लेकिन केवल परिवर्तनों पर ध्यान केंद्रित करने के लिए उन्हें छिपाया जा सकता है।
ऑनलाइन Text Diff उपकरण क्यों उपयोग करें?
टर्मिनल में पाठ की तुलना करने के लिए diff उपयोगिताएँ स्थापित करनी पड़ती हैं और कमांड-लाइन विकल्पों से जूझना पड़ता है। ब्राउज़र-आधारित diff उपकरण यह बाधा पूरी तरह समाप्त कर देता है।
Text Diff के उपयोग के अवसर
Diff आउटपुट प्रारूपों की तुलना
Diff उपकरण कई प्रारूपों में आउटपुट उत्पन्न करते हैं। नीचे दी गई तालिका सबसे सामान्य प्रारूपों का सारांश देती है, उन्हें कौन उत्पन्न करता है, और प्रत्येक कब उपयोगी है।
| प्रारूप | उपकरण / स्रोत | विवरण |
|---|---|---|
| Unified diff | diff -u / git diff | Prefixes lines with + / - / space; includes @@ hunk headers |
| Side-by-side | diff -y / sdiff | Two columns, changed lines aligned horizontally |
| Context diff | diff -c | Shows changed lines with surrounding context, marked with ! / + / - |
| HTML diff | Python difflib | Color-coded HTML table with inline change highlights |
| JSON Patch | RFC 6902 | Array of add/remove/replace operations on a JSON document |
पंक्ति Diff कैसे कार्य करता है: LCS एल्गोरिदम
अधिकांश पंक्ति-diff उपकरण, इस उपकरण सहित, Longest Common Subsequence (LCS) एल्गोरिदम का उपयोग करते हैं। LCS पंक्तियों के सबसे बड़े समुच्चय को खोजता है जो दोनों पाठों में समान सापेक्ष क्रम में उपस्थित हों, बिना सन्निकट होने की आवश्यकता के। LCS में न आने वाली पंक्तियाँ ही वास्तविक अंतर हैं।
मानक LCS एल्गोरिदम गतिशील प्रोग्रामिंग का उपयोग करता है और O(m x n) समय में चलता है, जहाँ m और n दोनों पाठों की पंक्ति संख्याएँ हैं। बड़ी फ़ाइलों के लिए, Myers' diff एल्गोरिदम (Git द्वारा उपयोग किया गया) जैसे अनुकूलित संस्करण इसे O(n + d^2) तक घटाते हैं, जहाँ d अंतरों की संख्या है, जो तब तेज़ होता है जब अधिकांश पंक्तियाँ साझा हों।
कोड उदाहरण
JavaScript, Python, Go, और कमांड लाइन में पंक्ति-दर-पंक्ति पाठ तुलना के कार्यान्वयन। प्रत्येक उदाहरण unified-style diff आउटपुट उत्पन्न करता है।
// Line-by-line diff using the LCS algorithm
function diffLines(a, b) {
const linesA = a.split('\n')
const linesB = b.split('\n')
// Build LCS table
const m = linesA.length, n = linesB.length
const dp = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0))
for (let i = 1; i <= m; i++)
for (let j = 1; j <= n; j++)
dp[i][j] = linesA[i-1] === linesB[j-1]
? dp[i-1][j-1] + 1
: Math.max(dp[i-1][j], dp[i][j-1])
// Backtrack to produce diff
const result = []
let i = m, j = n
while (i > 0 || j > 0) {
if (i > 0 && j > 0 && linesA[i-1] === linesB[j-1]) {
result.unshift({ type: 'equal', text: linesA[i-1] }); i--; j--
} else if (j > 0 && (i === 0 || dp[i][j-1] >= dp[i-1][j])) {
result.unshift({ type: 'add', text: linesB[j-1] }); j--
} else {
result.unshift({ type: 'remove', text: linesA[i-1] }); i--
}
}
return result
}
const diff = diffLines("alpha\nbeta\ngamma", "alpha\nbeta changed\ngamma\ndelta")
// → [
// { type: 'equal', text: 'alpha' },
// { type: 'remove', text: 'beta' },
// { type: 'add', text: 'beta changed' },
// { type: 'equal', text: 'gamma' },
// { type: 'add', text: 'delta' }
// ]import difflib
text_a = """alpha
beta
gamma""".splitlines()
text_b = """alpha
beta changed
gamma
delta""".splitlines()
# Unified diff (same format as git diff)
for line in difflib.unified_diff(text_a, text_b, fromfile='a.txt', tofile='b.txt', lineterm=''):
print(line)
# --- a.txt
# +++ b.txt
# @@ -1,3 +1,4 @@
# alpha
# -beta
# +beta changed
# gamma
# +delta
# HTML side-by-side diff
d = difflib.HtmlDiff()
html = d.make_file(text_a, text_b, fromdesc='Original', todesc='Modified')package main
import (
"fmt"
"strings"
)
// Minimal LCS-based line diff
func diffLines(a, b string) {
la := strings.Split(a, "\n")
lb := strings.Split(b, "\n")
m, n := len(la), len(lb)
dp := make([][]int, m+1)
for i := range dp {
dp[i] = make([]int, n+1)
}
for i := 1; i <= m; i++ {
for j := 1; j <= n; j++ {
if la[i-1] == lb[j-1] {
dp[i][j] = dp[i-1][j-1] + 1
} else if dp[i-1][j] >= dp[i][j-1] {
dp[i][j] = dp[i-1][j]
} else {
dp[i][j] = dp[i][j-1]
}
}
}
var result []string
i, j := m, n
for i > 0 || j > 0 {
if i > 0 && j > 0 && la[i-1] == lb[j-1] {
result = append([]string{" " + la[i-1]}, result...)
i--; j--
} else if j > 0 && (i == 0 || dp[i][j-1] >= dp[i-1][j]) {
result = append([]string{"+" + lb[j-1]}, result...)
j--
} else {
result = append([]string{"-" + la[i-1]}, result...)
i--
}
}
for _, line := range result {
fmt.Println(line)
}
}
// Output:
// alpha
// -beta
// +beta changed
// gamma
// +delta# Compare two files with unified diff (3 lines of context) diff -u original.txt modified.txt # Git diff between working tree and last commit git diff HEAD -- file.txt # Git diff between two branches git diff main..feature -- src/ # Side-by-side diff in the terminal diff -y --width=120 original.txt modified.txt # Color-coded diff (requires colordiff) diff -u original.txt modified.txt | colordiff