代码之家  ›  专栏  ›  技术社区  ›  Vicky Dev

强制sed在目标文件中只替换匹配行一次

  •  1
  • Vicky Dev  · 技术社区  · 6 年前

    我有以下脚本来替换PHP INI配置文件中指定的键值对:

    iniConfigs='memory_limit=3G
    short_open_tag=On
    post_max_size=512M
    max_input_time=3600
    max_execution_time=21600
    upload_max_filesize=128M
    extension_dir="C:\\PHPs\\PHP7032\\ext"'
    
    while IFS= read -r line
    do
        key=$(awk -F\= '{print $1}' <<< $line)
        sed -i "s/^\($key\).*/\1 ${line}/" php.ini
    done <<< "$iniConfigs"
    

    现在问题来了 sed key 并按预期用相应的行替换它,结果如下所示php.ini:

    short_open_tag short_open_tag=On
    ...
    max_execution_time max_execution_time=21600
    

    而不是,

    short_open_tag=On
    ...
    max_execution_time=21600
    

    为什么? 没有完全按照预期替换字符串?

    1 回复  |  直到 6 年前
        1
  •  1
  •   codeforester    6 年前

    你有 \1 在替换模式中。你不需要因为 $line 已经有钥匙了。这样做可以:

    while IFS= read -r line
    do
        key=$(awk -F\= '{print $1}' <<< $line)
        sed -i "s/^$key.*/$line/" php.ini
    done <<< "$iniConfigs"
    

    sed / .