Заставить sed заменить совпадающую строку только один раз в целевом файле - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть следующий скрипт для замены указанных пар ключ-значение в файле конфигурации 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 голосов
/ 21 сентября 2018

У вас есть \1 в шаблоне замены.Вам это не нужно, потому что у $line уже есть ключ.Это будет делать:

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

Этот код сломается, если ваш контент содержит символы, которые могут запутать sed.Например, /.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...