如何才能获得差异仅显示添加和删除的行

分享于 

4分钟阅读

电脑

  繁體 雙語

问题:

如何获取unix命令差异显示仅添加和删除的行? 如果差异不能做到,什么工具可以?


回答 1:

我不确定这是不是可以能的,因为它将很难区分更改的。添加的和删除的行。

考虑这个 file:


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 或者编辑它来替换它。


回答 2:

我也有同样的问题。 这里函数是获取最大更改行号的解决方案( 例如。 更改以字母'+'开头。 然后我再逐行循环遍历diff文件,直到触发行处理后才发送到行处理器:





#====================================================================


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"nb")


 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"nb")


 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"


}




史蒂夫



添加  显示  DEL  DIFF  
相关文章