2010-03-18 14 views
2

我有兩個文本文件,其中有幾個部分。每個部分都有一個包含部分名稱的標題(grep可以提取所有部分名稱,而無需從文件中提取任何其他內容)。如何報告兩個文件之間的差異並報告差異發生的部分?我還需要能夠報告添加/缺失部分。理想情況下,報告中根本不會提及相同的部分。如何區分兩個文件並報告差異發生的部分?

+0

你可以得到以'grep -n'開頭的行號,並用'diff'獲取更改,同時也包含行號。在腳本中匹配它們不應該那麼困難。 – 2010-03-18 15:25:51

+0

順便說一句 - 你想要一個統一的差異,對吧? – leedm777 2010-03-19 21:39:59

回答

1

如果您在頭文件中引入了一個虛假更改,那將會強制它們顯示在diff中。不完全是你想要的,但也許這會給你一個想法。

假設你尋找頭正則表達式是^HEAD

sed -e 's/^HEAD/>HEAD/' file1.txt | diff -u - file2.txt 

編輯:如果你想要得到的差異是一個真正的差異,你可以使用sed刪除水頭差線。

sed -e 's/^HEAD/>HEAD/' file1.txt | diff -u - file2.txt | sed -e 's/^->HEAD/ HEAD/; /^+HEAD/D' 
+0

這給了我一個走向的想法,但你的第二個例子仍然在輸出中留下了一些上下文。到目前爲止,我還沒有能夠刪除這些上下文的行 - 即使使用diff'-U 0'選項。我會再補充一點。 – Les 2010-03-22 14:09:33

2

使用diff--show-function-line參數:

diff -U 0 --show-function-line='^HEAD ' old-file new-file 

,如果你在末尾添加一個新的部分,不會,如果它apears只在輸出文件(例如報告正確的部分該文件,添加的行將顯示爲舊文件的最後一部分)。

下面的腳本可能會有所幫助,儘管它遠非單線程。它會打印:

  • 部分從已經刪除的行舊文件,從已插入的行新的文件" -"
  • 段前綴,與" +"
  • 刪除線(包括已刪除的章節標題)前綴與"+"
  • 插入線(包括新的部分標頭)中,用"-"

他前綴的前綴re是腳本:

#!/bin/bash 
# Usage : ./script old-file new-file 
diff \ 
    --new-line-format='+%dn'$'\n' \ 
    --old-line-format='-%dn'$'\n' \ 
    --unchanged-line-format='' \ 
    $1 \ 
    $2 \ 
    | \ 
(
    lnumOld=0; 
    lnumNew=0; 
    header='NO HEADER' 
    printheader=1 
    while read lprint; do 
     if [ "$((lprint))" -gt 0 ]; then 
      sep='+' 
      while [ $lnumNew -lt $lprint ]; do 
       read line <&4 
       if [ "${line#HEAD }" != "$line" ]; then 
        header="$sep$line" 
        printheader=1 
       fi 
       ((lnumNew++)); 
      done 
     else 
      sep='-' 
      while [ $lnumOld -lt $((-1*$lprint)) ]; do 
       read line <&3 
       if [ "${line#HEAD }" != "$line" ]; then 
        header="$sep$line" 
        printheader=1 
       fi 
       ((lnumOld++)); 
      done 
     fi 
     if [ $printheader = 1 ]; then 
      echo " $header" 
      printheader=0 
     fi 
     echo "$sep$line"; 
    done) 3<"$1" 4<"$2" 
相關問題