【问题标题】:compare two property files and replace values比较两个属性文件并替换值
【发布时间】:2016-04-06 21:44:33
【问题描述】:

我有两个文件 File_A 和 File_B 包含键/值对

文件_A

ANT_HOME=/opt/apps/apache-ant
HIBERNATE=/opt/apps/some/path/to/hibernate
BATCHDAEMON=false
BATCHEDIT_ENABLED=false
BATCHENABLED=false
----
----
<120 lines)

文件_B

ANT_HOME=$ANT_DIR
HIBERNATE=$HIBERNATE_LOCATION
----
DBCONNECTION=
DBNAME=
DBUSER=
DBPASS=
DBPORT=
DBSERVER=

<70 lines>

我想将 File_A 中的键与 File_B 中的键进行比较,以及是否存在从 File_B 到 file_A 的匹配替换值

最终结果

文件_A ANT_HOME=$ANT_DIR 休眠=$HIBERNATE_LOCATION DBCONNECTION= 数据库名称= 数据库用户= DBPASS= DBPORT= 数据库服务器= ……

还有一些值包含“=”
例如

SOME_PASSWD=Qwcnyt2-49zstyq4=  

所以我一直在使用正则表达式在“=”之前获取第一次出现的值

我正在使用 awk 来查看是否得到了想要的结果,但是我无法正确替换。

 awk 'BEGIN {FS = "/[^=]*/"} FNR==NR { array[$1]=$2; next } $1 in array { sub ($1, array[$2])} 1' File_B, File_A >> some_tempfile.ini

提前致谢

【问题讨论】:

    标签: shell unix


    【解决方案1】:

    先解析File_B的思路不错。

    如果字段分隔符 (FS) 设置为 =,则 $1 直接给出当前行的键。这导致使用关联数组。

    试试这个经过测试的版本:

    awk 'BEGIN { FS="="; } { if (NR==FNR) { pkeynline[$1]=$0; } else if (pkeynline[$1]) { print pkeynline[$1]; } else { print; } }'
    

    测试:

    $ cat File_A
    ANT_HOME=/opt/apps/apache-ant
    HIBERNATE=/opt/apps/some/path/to/hibernate
    BATCHDAEMON=false
    BATCHEDIT_ENABLED=false
    BATCHENABLED=false
    SOME_PASSWD=
    
    $ cat File_B
    ANT_HOME=$ANT_DIR
    HIBERNATE=$HIBERNATE_LOCATION
    SOME_PASSWD=Qwcnyt2-49zstyq4=
    UNIQ_KEY_FILEB=/home/life/is/great
    
    $ awk 'BEGIN { FS="="; } { if (NR==FNR) { pkeynline[$1]=$0; } else if (pkeynline[$1]) { print pkeynline[$1]; } else { print; } }' File_B File_A > some_tempfile.ini
    
    $ cat some_tempfile.ini
    ANT_HOME=$ANT_DIR
    HIBERNATE=$HIBERNATE_LOCATION
    BATCHDAEMON=false
    BATCHEDIT_ENABLED=false
    BATCHENABLED=false
    SOME_PASSWD=Qwcnyt2-49zstyq4=
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-28
      • 2020-01-11
      • 2016-06-20
      • 1970-01-01
      • 1970-01-01
      • 2015-08-12
      • 2020-03-16
      • 1970-01-01
      相关资源
      最近更新 更多