我怎么能写一个简单的差异。补丁脚本,用于对文件中的行列表应用添加和删除?
这可能是一个原始文件(它已排序,每行都是唯一的):
a
b
d
一个简单的补丁文件可能看起来像这样(或者说有点简单):
+ c
+ e
- b
生成的文件应该是(或者以任何其他顺序,因为sort
可以应用):
a
c
d
e
不能使用普通的补丁格式,因为它们包含上下文,在这种情况下可能会改变。
答案 0 :(得分:1)
使用comm
,awk
和grep
来应用这样的补丁的shell解决方案是:
A=a.txt B=b.txt P=patch.txt; { grep '^-' $P | cut -c 3- | comm -23 $A - ; grep '^+' $P | cut -c 3- } | sort -u > $B
生成补丁文件将是:
A=a.txt B=b.txt P=patch.txt; { comm -13 $A $B | awk '{print "+ " $0}' ; comm -23 $A $B | awk '{print "- " $0}' } > $P
答案 1 :(得分:1)
仅读取一次输入文件的Bash选项:
要生成补丁,您可以:
comm -3 a.txt b.txt | sed 's/^\t/+ /;t;s/^/- /'
由于使用制表符,comm
从不同文件输出了分度符,因此我们可以使用该制表符来检测是否应添加或删除行。
要应用补丁,您可以:
{ <patch.txt tee >(grep '^+ ' | cut -c3- >&5) |
grep '^- ' | cut -c3- | comm -13 - a.txt; } 5> >(cat)
tee
将输入(即补丁文件)分成两个流。第一部分已过滤+
,并输出到文件描述符5
。文件描述符5
仅向>(cat)
打开,因此仅在stdout上输出。第二部分已过滤出负数-
,并与a.txt
连接并输出。因为输出应该是行缓冲的,所以应该可以工作。
答案 2 :(得分:0)
由于没有人能给我一个答案,我已经创建了一个小的python脚本,它完成了这项工作。 https://github.com/white-gecko/simplepatch
要应用此类补丁,请将其调用(生成outfile.txt
)
./simplepatch.py -m patch -i infile.txt -p patchfile.txt -o outfile.txt
生成补丁/差异调用(生成patchfile.txt
)
./simplepatch.py -m diff -i infile.txt -o outfile.txt -p patchfile.txt