如何制作和应用(修补)一侧差异?

Dan*_*iga 5 scripting diff configuration patch text-processing

我想制作一个更新配置文件的 shell 脚本。

服务器上的文件包含信息,例如各种 IP 地址。

新文件有更多代码,从添加到系统的新配置开始,我希望能够将这些新配置添加到服务器文件中,而无需更改那里已经配置的内容

例子:

服务器文件

[config]
ip=127.0.0.1
port=22
Run Code Online (Sandbox Code Playgroud)

新文件

[config]
ip=XXX.XXX.XXX.XXX
port=XX
user=root
Run Code Online (Sandbox Code Playgroud)

我希望生成的文件是

[config]
ip=127.0.0.1
port=22
user=root
Run Code Online (Sandbox Code Playgroud)

怎么会是一个好方法呢?我不想依赖行位置等,因为实际的配置文件非常大,并且可以将更多行添加到服务器文件中。

我试图对文件进行差异化并应用补丁,但没有奏效。

谢谢你的帮助。

Jim*_*ris 7

正如吉尔斯所说,您需要使用一种了解配置文件格式的工具。对于您的特定示例,您可以使用使用内置ConfigParser模块的简短 Python 脚本。

  • 首先,假设您在服务器上的原始配置文件是original.cfg

    [config]
    ip=127.0.0.1
    port=22
    
    Run Code Online (Sandbox Code Playgroud)
  • 现在将您的更改放在一个名为的新文件中update.cfg

    [config]
    user=root
    
    Run Code Online (Sandbox Code Playgroud)

    此文件应在您希望它们放置的部分标题下列出新的或更改的条目。

  • 然后运行一个这样的脚本:

    #!/usr/bin/env python
    
    import ConfigParser
    
    config = ConfigParser.ConfigParser()
    
    # Read the original config file
    with open('original.cfg', 'r') as f:
        config.readfp(f)
    
    # Also read in all the changes we'd like to make
    with open('update.cfg', 'r') as f:
        config.readfp(f)
    
    # Write the full new config file out
    with open('output.cfg', 'w') as f:
        config.write(f)
    
    Run Code Online (Sandbox Code Playgroud)

当然,如何做到这一点有很多变化。例如,配置更改可以直接编码到 Python 脚本中,而不是从单独的update.cfg文件中读取。不过,这应该为您提供一个良好的入门基础。