我有一个问题需要帮助。
我正在编写一个脚本来更改文件示例中的参数

global
  maxconn 4096
  pidfile /var/run/haproxy.pid
  daemon

defaults
  mode http
  retries 3
  maxconn 2000

我想将全局中的maxconn更改为10000,并将maxconn保持默认值为2000,但是当我通过命令sed更改全局中的maxconn时,默认值中的maxconn也会更改。请帮帮我!

最佳答案

sed是一个很好的工具,用于在单行上进行简单的替换,但对于其他任何情况,只需使用awk:

$ awk -v RS= -v ORS='\n\n' '/^global/{ sub(/maxconn[^\n]+/,"maxconn 10000") }1' file
global
  maxconn 10000
  pidfile /var/run/haproxy.pid
  daemon

defaults
  mode http
  retries 3
  maxconn 2000

要将命令(awk或其他)的输出写回原始文件,请执行以下操作:
command file > tmp && mv tmp file

“tmp”只是一个名为whatever和where you please,/usr/tmp/tmp$$的tmp文件。
因此,对于这个特定的命令,您可以执行以下操作:
awk -v RS= -v ORS='\n\n' '/^global/{ sub(/maxconn[^\n]+/,"maxconn 10000") }1' file > /usr/tmp/tmp$$ && mv /usr/tmp/tmp$$ file

10-07 23:05