代码之家  ›  专栏  ›  技术社区  ›  jlanza

用sed替换或追加配置文件

  •  1
  • jlanza  · 技术社区  · 7 年前

    我想替换或附加在sshd_config这样的配置文件中:

    Key1 value
    #Key2 value
    

    $ cmd Key1 home file
    $ cmd Key2 house file
    $ cmd Key3 flat file
    

    因此生成的文件是:

    Key1 home
    Key2 house
    Key3 flat
    

    任何帮助都是非常受欢迎的。

    我已经采取了 this

    除此之外,我还使用了其他选项,但仅限于注释或未注释行,如果可能的话,我希望所有内容都在一个命令中。

    sed '/^Key\s/{h;s/\(\s\).*/\1newvalue/};${x;/^$/{s//Key newvalue/;H};x}' file
    

    如果这个键存在,这个,但是如果不存在,我怎么追加呢?

    sed -i 's/^#\(Key\s\).*/\1newvalue/g' file
    

    编辑:内置-i的Stdout输出

    $ sudo tee -a /usr/local/bin/conf-space-replace-or-append > /dev/null << 'EOL' 
    #!/bin/bash
    
    awk -i inplace -v key="$1" -v val="$2" '
    ($1 == key) || ($1 == "#"key) { $0 = key OFS val; done=1 }
    { print }
    END { if (!done) print key, val }
    ' "$3" > /dev/null
    EOL
    
    $ sudo chmod +x /usr/local/bin/conf-space-replace-or-append
    $ sudo conf-space-replace-or-append Port 22 /etc/ssh/sshd_config
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Ed Morton    7 年前

    sed用于在单个行上执行s/old/new,仅此而已。对于其他任何东西,您应该使用awk来实现清晰、简单、可移植性、效率等。

    cmd 按照你在问题中的表现来执行。

    awk -v key="$1" -v val="$2" '
    ($1 == key) || ($1 == "#"key) { next }
    { print }
    END { print key, val }
    ' "$3"
    

    以上将删除现有的键+ VAR,如果存在,并总是追加新的对文件的结尾。如果你宁愿将现有的密钥保存在文件中的原始位置,而只在结尾添加新的密钥+ ValION,那么这只是一个调整:

    awk -v key="$1" -v val="$2" '
    ($1 == key) || ($1 == "#"key) { $0 = key OFS val; done=1 }
    { print }
    END { if (!done) print key, val }
    ' "$3"