Shell 添加或更改变量值

Shell 添加或更改变量值,shell,sed,Shell,Sed,我想在/etc/my.cnf中添加以下行 服务器id=1789051 线路可能在那里,也可能不在那里。 如果存在,则通常是服务器id=1 如果我的IP是192.178.90.51,那么服务器id应该是1789051 我想知道一个shell脚本或命令是否可以做到这一点。awk的单向 sed --in-place --expression='$aserver-id=1789051' --expression='/^server-id=/d' \ /etc/my.cnf #!/bin/bas

我想在/etc/my.cnf中添加以下行

服务器id=1789051

线路可能在那里,也可能不在那里。 如果存在,则通常是服务器id=1 如果我的IP是192.178.90.51,那么服务器id应该是1789051

我想知道一个shell脚本或命令是否可以做到这一点。

awk的单向

sed --in-place --expression='$aserver-id=1789051' --expression='/^server-id=/d' \
    /etc/my.cnf
#!/bin/bash
ip=1.2.3.4
awk -v ip="$ip" '/server-id/{
    $0="server-id="ip;f=0
    f=1
    g=1
}
{print}
END{
  if(g==0){ print "server-id="ip  }
}' file
存在“服务器id”时的输出

没有“服务器id”时的输出


这将替换文件中相同位置的行(如果存在),而不是将其移动到末尾。如果它不存在,它将把它附加到文件的末尾

sed  '1{x;s/^$/server-id=1789051/;x};/^server-id=/{s/^.*$//;x};${G;s/\n//}' /etc/my.cnf

“--in-place”适用于GNU sed,而不是POSIX标准版本的sed。与“$a”(结尾追加)一起使用的符号对GNU sed也是唯一的;标准版本要求脚本中有反斜杠和换行符。也就是说,它似乎与GNU sed一起工作。@Jonathan Leffler:我本以为双破折号长选项是一个足够清楚的指标,表明这确实是GNU sed。
$ more file
1
2
end
$ ./shell.sh
1
2
end
server-id=1.2.3.4
sed  '1{x;s/^$/server-id=1789051/;x};/^server-id=/{s/^.*$//;x};${G;s/\n//}' /etc/my.cnf