2017-02-07 7 views
0

多くのペアの間で統一された差分を取得しようとしているので、ペア間の比較が一貫していることを確認できます。絶対パスではなく相対パスで出力をフォーマットする方法があるかどうかを知りたいです。今、私はdiff -r -u PATH1 PATH2を使用している場合、私はこのような出力を得るdiffツールに再帰差分のファイルの相対パスのみを報告させる方法はありますか?

diff -r -u PATH1/some/subfile.txt PATH2/some/subfile.txt 
--- PATH1/some/subfile.txt  Tue Feb 07 09:16:31 2017 
+++ PATH2/some/subfile.txt  Tue Feb 07 09:16:32 2017 
@@ -70,7 +70,7 @@ 
    * 
    * some stuff 
    * 
- * I am Tweedledee and you are not 
+ * I am Tweedledum and you are not 
    */ 
void twiddle(void) 
{ 
@@ -88,7 +88,7 @@ 
    * check whether we should destroy everything 
    * and then destroy everything in either case 
    */ 
-inline static void Tweedledee(void) 
+inline static void Tweedledum(void) 
{ 
    if (should_destroy_everything()) 
    { 

私はむしろちょうど相対パスになるだろう... diffこれを行うために取得する方法はありますか?例:

diff -r -u PATH1/some/subfile.txt PATH2/some/subfile.txt 
--- some/subfile.txt 
+++ some/subfile.txt 
@@ -70,7 +70,7 @@ 
    * 
    * some stuff 
    * 
- * I am Tweedledee and you are not 
+ * I am Tweedledum and you are not 
    */ 
void twiddle(void) 
{ 
@@ -88,7 +88,7 @@ 
    * check whether we should destroy everything 
    * and then destroy everything in either case 
    */ 
-inline static void Tweedledee(void) 
+inline static void Tweedledum(void) 
{ 
    if (should_destroy_everything()) 
    { 

これにより、同じであると予想される差分レポートを比較しやすくなります。

は、そうでなければ私は(手動またはスクリプトを使用して)この情報を除外しなければならない(私の場合PATH1PATH2は相対パスに対しファイルに、それぞれの場合に異なっており、正確な内容の差は同じである)

答えて

1

diffコマンドの出力を次のようなsedスクリプトにパイプします。 $ diff -r -u PATH1/some/subfile.txt PATH2/some/subfile.txt | sed '1s/PATH1 \ ///' | sed '2s/PATH2 \ ///' スクリプトは ":1行目に" PATH1 "を置き換え、その後にスラッシュを1つ、何もしないで、2行目に" PATH2 "を置き換えて

+0

あなたも、手の込んだ得ることができます: sedは '1秒を/^\\(\\ ---)PATH1 \ // \ 1 /' と sed '2s/^ \\(+++ \\)PATH2 \/\ 1 /' これらの2つのステートメントは、それぞれ行の先頭にPATH1とPATHを削除するようにと言っています。その前に '---'と '+++'があるとします。 –

+0

ありがとう...バー、私はちょうど私が望むことをするためにPythonスクリプトでそれを解析した。 –

0

私はPythonでこの構文解析を行いました; diff blah blah blahステートメントを削除し、パスを相対化しています。これをテストするには、いくつかのコンテンツを作成する必要があります。また、タイムスタンプを削除する指定したルートディレクトリのペアに:

udiff_re = re.compile(r'^@@ -(\d+),(\d+) \+(\d+),(\d+) @@$') 
diffitem_re = re.compile(r'^(\+\+\+|---) (.*)\s+.{7} \d\d \d\d:\d\d:\d\d \d{4}$') 
def process_diff_output(output, dir1, dir2): 
    state = 0 
    lines_pending = [0,0] 
    result = [] 
    for line in output.splitlines(): 
     if state == 0: 
      if line.startswith('@@'): 
       m = udiff_re.search(line) 
       if m: 
        nums = [int(n) for n in m.groups()] 
       else: 
        raise ValueError('Huh?\n' + line) 
       result.append(line) 
       lines_pending = [nums[1],nums[3]] 
       state = 1 
      elif line.startswith('--- ') or line.startswith('+++ '): 
       m = diffitem_re.search(line) 
       whichone = m.group(1) 
       filename = m.group(2) 
       dirx = dir1 if whichone == '---' else dir2 
       result.append('%s %s' % (whichone, os.path.relpath(filename, dirx))) 
      elif line.startswith('diff '): 
       pass # leave the diff cmd out 
      else: 
       raise ValueError('unknown header line\n'+line) 
     elif state == 1: 
      result.append(line) 
      if line.startswith('+'): 
       lines_pending[1] -= 1 
      elif line.startswith('-'): 
       lines_pending[0] -= 1 
      else: 
       lines_pending[0] -= 1 
       lines_pending[1] -= 1 
      if lines_pending == [0,0]: 
       state = 0 
    return '\n'.join(result) 
関連する問題