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