【问题标题】:Simple diff/patch script for sorted unique file用于排序的唯一文件的简单差异/补丁脚本
【发布时间】:2015-07-13 23:37:15
【问题描述】:

我怎么能写一个简单的差异。用于对文件中的行列表应用添加和删除的补丁脚本?

这可能是一个原始文件(已排序且每一行都是唯一的):

a
b
d

一个简单的补丁文件可能看起来像这样(或以某种方式简单):

+ c
+ e
- b

生成的文件应如下所示(或以任何其他顺序,因为无论如何都可以应用sort):

a
c
d
e

不能使用正常的补丁格式,因为它们包含上下文,在这种情况下可能会改变。

【问题讨论】:

    标签: shell sorting text-files unique patch


    【解决方案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 只打开到&gt;(cat),所以它只是在标准输出上输出。第二部分将减号- 过滤,并与a.txt 连接并输出。因为输出应该是行缓冲的,所以它应该可以工作。

    【讨论】:

    • Cool B-) 只需添加| sort -u 甚至在应用补丁后给出一个排序文件。
    【解决方案2】:

    使用commawkgrep 应用此类补丁的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
    

    【讨论】:

      【解决方案3】:

      由于没有人可以给我答案,我创建了一个小型 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
      

      【讨论】:

        猜你喜欢
        • 2020-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-30
        • 1970-01-01
        • 2011-05-12
        • 2011-01-28
        • 1970-01-01
        相关资源
        最近更新 更多