如何仅更改文件中的一个参数

时间:2013-08-26 14:57:56

标签: linux shell parameters sed

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

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

defaults
  mode http
  retries 3
  maxconn 2000

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

3 个答案:

答案 0 :(得分:1)

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”只是一些名为tac文件的名称,例如/usr/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

答案 1 :(得分:0)

这个怎么样?

#!/bin/bash

if [ ! $# -eq 1 ]; then
    echo "Wrong number of parameters"
    exit
fi

awk -v new_value=$1 '{
    if ($2 == "")
            global = ($1 == "global");

    if ($1 == "maxconn" && global) {
            printf "  maxconn %s\n", new_value;
    } else {
            print $0;
    }
}'

运行执行:

./change.sh 10000 < conf.txt

我假设上面的脚本名为change.sh,你的输入保存在conf.txt中。

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed -r '/^global/{:a;n;s/^(\s*maxconn ).*/\110000/;Ta}' file

这将查找以global开头的行,然后打印该行以及下一行等,直到当前行包含maxconn时,它替换新值并且循环被破坏。