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