2

私がやりたいのは、2つのファイルをdiffし、diff出力を3つの異なるファイルに書き込むことです。次のように出力をフォーマットするようにdiffに指示できます。

diff a.txt b.txt --new-line-format=... --old-line-format=... --unchanged-line-format=...

そしてこれを使用して:

diff a.txt b.txt --new-bla-bla="echo %l>new.txt" --old--="echo %l>old" ...

二重引用符が表示されないことを除いて、3つの異なるファイルに出力できます。
これをできるだけ最小限に抑えたいので、3つのdiffなどを実行することはできません

4

2 に答える 2

1

これはおそらく少し長いソリューションですが、次の必要性を回避するため、より堅牢ですeval

diff a.txt b.txt --new-line-format "3 %L" \
                 --old-line-format "4 %L"\
                 --unchanged-line-format "5 %L" |\
   while read -r fd line; do
     echo "$line" >&$fd
   done 3> new.txt 4> old.txt 5> unchanged.txt

これは、新しい行、古い行、および変更されていない行のそれぞれに、追加するファイルのファイル記述子をプレフィックスとして付けることで機能します。次に、を使用して出力を解析し、readその行を正しいファイル記述子にエコーします。各記述子は正しい出力ファイルにリダイレクトされます。

于 2012-08-30T15:34:43.457 に答える
0

@chepnerの優れた答えを読む前に、次のように書きました。

diff diff_old diff_new --new-line-format='>%L' --old-line-format='<%L' --unchanged-line-format='=%L' |  
awk '
    function printto(file) {print substr($0,2) > file} 
    /^>/ {printto("new.txt")} 
    /^</ {printto("old.txt")} 
    /^=/ {printto("unchanged.txt")}
'

これは彼の答えと同じように機能しますが、current [*]シェルで機能する代わりに、別のプロセスが必要です。

[*]パイプラインのwhileコマンド用に作成されたサブシェルを割り引く。

于 2012-08-30T20:17:55.200 に答える