2

我想要做的是,区分 2 个文件并将 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 个差异等不是一个选项

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")}
'

这与他的回答类似,但需要另一个进程而不是在当前 [*] shell 中工作。

[*] 忽略为管道中的 while 命令创建的子 shell。

于 2012-08-30T20:17:55.200 回答