用sed替换或追加配置文件

时间:2018-08-13 20:55:06

标签: sed replace append

我想替换或附加到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

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

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

$ 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 个答案:

答案 0 :(得分: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(如果存在),并始终将新对添加到文件末尾。如果您希望将现有密钥保留在文件中的原始位置,并且仅在末尾添加新的密钥+ 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"