编辑:与以下原始答案相同,但避免选项在HP-UX上不受diff支持。使用类似:
diff -b -r -w /tmp/one.txt /tmp/two.txt \
| sed -n -e '/c/ {s/[^c]*c\(.*\)/\1 p/;p}' \
| sed -n -f - /tmp/two.txt > /tmp/changed.txt
diff -b -r -w /tmp/one.txt /tmp/two.txt \
| sed -n -e '/a/ {s/[^a]*a\(.*\)/\1 p/;p}' \
| sed -n -f - /tmp/two.txt > /tmp/new.txt
此行号输出转换从diff到sed打印(p)为增加(a)和变更的命令(c)行范围。生成的sed脚本将应用于第二个文件以仅打印所需的行。 (我希望HP-UX sed从标准输入接收脚本支持-f -)
似乎有是不需要从diff输出解释行号的解决方案。 diff支持--side-by-side格式(-y),其中包括分别用和|标记旧,新和改变的线条的排水槽。您可以使用--width=1(或-W1)将此并排格式减少为标记。如果您使用已更改的标记和新的标记(grep -v)并在第二个文件的行前加上(paste),则可以通过前缀标记筛选(grep)并丢弃标记(cut)。您可以为新文件和更改文件执行此操作。
这里是一个自包含的“脚本”为例:
# create two example files (one character per line)
echo abcdefghijklmnopqrstuvwxyz | grep -o . > /tmp/one.txt
echo abcDeFghiJKlmnopPqrsStuvVVwxyzZZZ | grep -o . > /tmp/two.txt
# diff side-by-side to get markers and apply to new file
diff -b -r -w -y -W1 /tmp/one.txt /tmp/two.txt \
| fgrep -v '
| grep -e '^|' | cut -c3- > /tmp/changed.txt
diff -b -r -w -y -W1 /tmp/one.txt /tmp/two.txt \
| fgrep -v '
| grep -e '^>' | cut -c3- > /tmp/new.txt
# dump result
cat /tmp/changed.txt
echo ---
cat /tmp/new.txt
它的输出是
D
F
J
K
---
P
S
V
V
Z
Z
Z
我希望这可以帮助您解决问题。