【问题标题】:Replace or append in configuration file with sed用 sed 替换或追加配置文件
【发布时间】:2019-01-20 15:51:49
【问题描述】:

我想替换或追加配置文件,如 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 为例,但是 cmets 和 uncmets 不能正常工作。

除了我已经使用其他选项进行了管理,但仅适用于 cmets 或未注释的行,如果可能的话,我希望所有内容都在一个命令中。

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

如果密钥存在,则获取,但是,如果不存在,我该如何追加=

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

非常感谢。我试图理解 sed,但不同的空间非常复杂,我不知道如何使用 # 或不使用。

编辑:使用 -i inplace 的标准输出输出

$ 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

【问题讨论】:

    标签: sed replace append


    【解决方案1】:

    sed 用于在单独的行上执行 s/old/new,仅此而已。对于其他任何事情,为了清晰、简单、可移植、效率等,你应该使用 awk。

    只需将以下内容放入名为 cmd 的文件中,然后按照问题中的说明执行即可。

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

    上面将删除现有的 key+val(如果存在)并始终将新对附加到文件的末尾。如果您希望将现有密钥保留在文件中的原始位置,并且只在末尾添加新的 key+val 对,那么这只是一个调整:

    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"
    

    【讨论】:

    • 好的,但它会打印到标准输出。这是 awk 的默认行为吗?我知道通过重定向我可以修复它。但即使使用 -i inplace 也会重定向到文件和标准输出
    • 是的,-i inplace 不会打印到标准输出,它只会打印到输入文件。记住-i inplace 只是 GNU awk - 也许你没有使用 GNU awk?
    • 我猜是我的系统很奇怪,因为-i inplace 正在写入文件和标准输出。我已经包含了&gt; /dev/null 重定向;)
    • 这不可能发生,你的代码中肯定有其他事情发生。请在您的问题中发布完整的内容cmd(必须是演示此问题的最小脚本)以及完整的示例输入和运行后的输入文件以及运行时的标准输出(如果您需要帮助进行调试)问题。
    • 你有......这只是你的代码;)也许我复制错了......无论如何 /dev/null 没什么大不了的
    猜你喜欢
    • 2016-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 2022-10-21
    • 2014-02-05
    相关资源
    最近更新 更多