जवाबों:
मुझे यकीन नहीं है कि यह संभव है क्योंकि परिवर्तित, जोड़े और हटाए गए लाइनों के बीच अंतर करना मुश्किल होगा।
इस फाइल पर विचार करें:
start
old
old
old
end
हम इसे संपादित करते हैं तो ऐसा लगता है:
start
old
old but now new
new
new
end
यदि हम diff
इसे प्राप्त करते हैं तो हमें यह आउटपुट मिलता है:
< old
< old
---
> old but now new
> new
> new
यह उत्पन्न करने के लिए सीधा है। लेकिन अगर आप diff
केवल जोड़े गए और हटाए गए लाइन को प्रिंट करने के लिए कहते हैं, तो मुझे लगता है कि यह राय का विषय है कि कौन सी लाइनें जोड़ी गई हैं और हटा दी गई हैं और जिन्हें बदल दिया गया है। उदाहरण के लिए, क्या मैंने कहा कि पिछली पंक्ति को हटा दिया था old
और इसे उस पंक्ति से बदल दिया जो कहा new
या मैंने इसे संपादित किया था?
sdiff file1 file2
उन लाइनों के बिना ouput दिखाएं, जिसमें दोनों तरफ प्रविष्टियां हों। यदि आप सभी परिवर्तित लाइनों को हटाए गए और जोड़े गए लाइनों के रूप में मानते हैं, तो आप मूल रूप सेcomm -3 file1 file2
मेरा भी यही सवाल था। यह फ़ंक्शन अधिकतम परिवर्तन लाइन नंबर (यानी पत्र '+' अक्षर से शुरू होता है) प्राप्त करने के लिए मेरा समाधान था। जिसके बाद मैं लाइन द्वारा फिर से अलग फ़ाइल के माध्यम से लूप करता हूं और लाइन प्रोसेसर को तब तक नहीं भेजता जब तक कि यह प्रक्रिया शुरू करने के लिए लाइन को ट्रिगर न कर दे:
#====================================================================
proc_diff_file() # processes a diff file
#====================================================================
# Arg_1 = Diff File Name
# Arg_2 = New File Name - the one with the new lines
{
NEW_FILE=$1
A_FILE=$2
if [ -f "$A_FILE" ]; then
echo "processing diff $A_FILE"
pre_process_diff $A_FILE
# Set loop separator to end of line
ndx=0
BAKIFS=$IFS
IFS=$(echo -en "\n\b")
exec 3<&0
exec 0<$A_FILE
while read line
do
ndx=$(expr $ndx + 1)
# use $line variable to process line in processLine() function
if [ $ndx > $max_ndx ]; then
proc_age $line
fi
done
exec 0<&3
# restore $IFS which was used to determine what the field separators are
IFS=$BAKIFS
# cleanup $NEW_FILE
echo "processing diff $A_FILE done"
fi
}
यहाँ समारोह है:
#====================================================================
pre_process_diff() # pre-processes a diff file for last changed line
# sets a variable named $max_ndx
#====================================================================
# Arg_1 = Diff File Name
{
A_FILE=$1
max_ndx=
# collect last line number of diff +
# all lines following are new data
`grep -n "^[+]" $A_FILE | gawk '-F:' '{ print $1 }' >tmp`
# Set loop separator to end of line
# read through to the last line number
BAKIFS=$IFS
IFS=$(echo -en "\n\b")
exec 3<&0
exec 0<tmp
while read last_line
do
max_ndx=$last_line
done
exec 0<&3
# restore $IFS which was used to determine what the field separators are
IFS=$BAKIFS
echo "pre-processing diff $A_FILE done max_ndx=$max_ndx"
}
स्टीव