用sed替换或追加配置文件中的内容

用sed替换或追加配置文件中的内容,sed,replace,append,Sed,Replace,Append,我想替换或附加到配置文件中,如sshd\u config: Key1 value #Key2 value 该命令的思想是: $ cmd Key1 home file $ cmd Key2 house file $ cmd Key3 flat file 因此,生成的文件是: Key1 home Key2 house Key3 flat 任何帮助都是非常受欢迎的 我已经举了一个例子,但是注释和取消注释不能正常工作 此外,我还使用了其他选项,但仅限于注释或未注释行,如果可能的话,我希望所有内容都

我想替换或附加到配置文件中,如sshd\u config:

Key1 value
#Key2 value
该命令的思想是:

$ cmd Key1 home file
$ cmd Key2 house file
$ cmd Key3 flat file
因此,生成的文件是:

Key1 home
Key2 house
Key3 flat
任何帮助都是非常受欢迎的

我已经举了一个例子,但是注释和取消注释不能正常工作

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

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
$sudo tee-a/usr/local/bin/conf space replace或append>/dev/null/dev/null
下线
$sudo chmod+x/usr/local/bin/conf空格替换或追加
$sudo conf空间替换或附加端口22/etc/ssh/sshd\u config

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添加到文件的末尾。如果您希望将现有密钥保留在其在文件中的原始位置,并且只在末尾添加新的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
既在写入文件又在写入标准输出。我已经包括了
/dev/null
重定向;)这是不可能发生的,你的代码中肯定有其他的东西。如果您想帮助调试问题,请在问题中发布完整内容
cmd
(必须是演示此问题的最小脚本),以及完整的示例输入和运行后的输入文件,以及运行时的标准输出。您已经。。。这只是您的代码;)也许我抄错了。。。无论如何,/dev/null不是什么大问题