मैं केवल जोड़ी गई और हटाई गई लाइनों को दिखाने के लिए कैसे अलग हो सकता हूं


2

मैं यूनिक्स कमांड को केवल जोड़े गए और हटाए गए लाइनों से अलग कैसे दिखा सकता हूं? यदि भिन्न यह नहीं कर सकता है, तो कौन सा उपकरण कर सकता है?


1
क्या हम यूनिक्स कमांड के बारे में बात कर रहे हैं?
जोहान

जवाबों:


3

मुझे यकीन नहीं है कि यह संभव है क्योंकि परिवर्तित, जोड़े और हटाए गए लाइनों के बीच अंतर करना मुश्किल होगा।

इस फाइल पर विचार करें:

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या मैंने इसे संपादित किया था?


1
(+1) सिद्धांत रूप में सहमत हैं, लेकिन जो कुछ अलग-थलग है उसे जोड़ने का एक तरीका होना चाहिए, जो कि जोड़ी गई और हटाई गई लाइनें हैं। इसे दूसरे तरीके से डालने के लिए, sdiff file1 file2उन लाइनों के बिना ouput दिखाएं, जिसमें दोनों तरफ प्रविष्टियां हों। यदि आप सभी परिवर्तित लाइनों को हटाए गए और जोड़े गए लाइनों के रूप में मानते हैं, तो आप मूल रूप सेcomm -3 file1 file2
nagul

6

करता है diff -u0कि तुम क्या चाहते हो?


ऐक्स पर अंतर -00 (दुर्भाग्य से) को नहीं पहचानता है।
सी। रॉस

2
आप GNU को स्थापित कर सकते हैं ..
dmckee

2

मेरा भी यही सवाल था। यह फ़ंक्शन अधिकतम परिवर्तन लाइन नंबर (यानी पत्र '+' अक्षर से शुरू होता है) प्राप्त करने के लिए मेरा समाधान था। जिसके बाद मैं लाइन द्वारा फिर से अलग फ़ाइल के माध्यम से लूप करता हूं और लाइन प्रोसेसर को तब तक नहीं भेजता जब तक कि यह प्रक्रिया शुरू करने के लिए लाइन को ट्रिगर न कर दे:


#====================================================================
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"
}

स्टीव


जीएनयू अंतर स्थापित करें, और इसका उपयोग करें। AIX के उपकरण गंभीर रूप से पुराने हैं।
वॉनब्रांड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.