想要使用 Awk 和 Sed 比较配置参数并在值不同时替换

Want to compare a config parameter and replace if value is different using Awk and Sed

有一个包含键值的配置文件

key1=1   
key2=2
key5=6

想把key5不是5的值替换为10

awk '
BEGIN{FLAG=0}
/key5=6/{FLAG=1}
END { if (FLAG == 0) {sed -i "s/^key5.*/key5=10/1"
    print "key5 is now 10" } }' test.config

代码在不同的行上。另外,忽略开始和结束双引号。使用此编辑器无法正确完成。 sed 命令不起作用,我是否正确转义了它? sed 本身在命令行上运行良好

此答案假定您的配置文件的键值对实际上每个都在单独的一行上,这正是您的 awk 命令所建议的。

看起来您正试图在 程序中直接从 调用 sed,这不会起作用 - 唯一的方法从 awk 调用其他实用程序是使用 system() 函数或管道 ("<cmd>" | getline ...)。

但是,这很少是正确的方法;相反,使用 awk 修改输入字段的能力:

awk 'BEGIN{ FS=OFS="=" } =="key5" && !=5 {  = 10 } { print }' test.config
  • BEGIN{ FS=OFS="=" } 告诉 awk= (FS) 将每个输入行拆分为多个字段,并用 = (= ( OFS)。
    • OFS 适用于将 print 与多个参数一起使用时,以及通过分配给输入字段导致输入行重建时。
  • =="key5" && !=5匹配key部分为key5,value部分为not5的行
    • 10 分配给 </code> - 第二个输入字段 - 然后导致输入行 <em> 重建</em>,导致 <code>key5=10
  • { print } 简单地打印每个(可能修改过的)输入行。

sed:如果该行以 key5= 开头,并且 而不是 =5 结尾,则替换值

sed '/^key5=/ {/=5$/! s/=.*/=10/}' <<END
key1=1   
key2=2
key5=5
key5=6
END
key1=1   
key2=2
key5=5
key5=10