将diff输出发送到3个文件

时间:2012-08-30 14:36:57

标签: bash diff file-descriptor

我想要做的是,diff 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个差异等不是一个选项

2 个答案:

答案 0 :(得分:2)

这是一个可能更长一点的解决方案,但更强大,因为它避免了对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解析输出,并将该行回显到正确的文件描述符,每个文件描述符都被重定向到正确的输出文件。

答案 1 :(得分: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。