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

时间:2018-09-21 00:16:23

标签: bash shell sed replace

我有以下脚本来替换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

为什么sed不能完全按预期替换字符串?

1 个答案:

答案 0 :(得分:1)

您的替换模式中有\1。您不需要这样做,因为$line已经有了密钥。可以做到:

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

如果您的内容中包含的字符超出sed的范围,则此代码将中断。例如,/