如何仅差异和修补新行

时间:2019-07-20 00:20:53

标签: bash shell awk diff patch

我有2个配置文件(.ini),我想将新添加的行从配置文件1升级到配置文件2。我不想修改或删除行。

为此,我使用以下命令。但是它们也给了我修改/删除的行。

diff -u conf2 conf1|grep -E ^\+ >temp
patch -u -o conf2 -i temp

如果我安装了git client,我可以使用以下命令解决此问题。

git diff --diff-filter=a conf2 conf1|grep -E ^\+ >temp 
patch -o conf2 -i temp

您能否帮助仅获取新添加的行并将其修补为完全相同的行号,而无需使用任何第三方工具。我也不想修补已修改或删除的行。

这是示例配置文件。

conf1
# app1 configuration
[app1]
username=root
ssh_port=22
http_port=8080
sd_port=8005

conf2
# app1 configuration
[app1]
username=admin
ssh_port=22
http_port=8080

现在,我只需要修补sd_port参数。不是更改的用户名。

谢谢。

1 个答案:

答案 0 :(得分:1)

awk可以做到这一点。与

/ * diff.awk * /

BEGIN {FS="="}
FILENAME==ARGV[1] && $1 !~ /^[#\[]/ {
    a[$1]=$2
} 
FILENAME==ARGV[2] {
    b[$1]=$2
}
END {
    for(i in b) {
        for(j in a) {
            if(!b[j]) {
                c[j]=a[j]
            }
        }
        c[i]=b[i]
    }
    for(k in c) {
        print k"="c[k]
    }
}

运行

awk -f diff.awk conf1 conf2

应该给您

sd_port=8005
ssh_port=22
http_port=8080
username=admin