Intereting Posts
Как получить выполненную команду процесса, который успешно завершил работу с PID? смонтировать samba, когда пользователь входит в систему Как успешно выполняется команда passwd из учетной записи, отличной от root Исправить это правило айпармора? tmux не проходит корректно последовательности ctrl-shift-arrow Отслеживание от экземпляра httpd до PHP-скрипта, когда PHP является модулем Как получить анимированное всплывающее окно в MATLAB для отображения моих функций Принтер HP не будет работать в Debian с OpenRC Inotifywait для большого количества файлов в каталоге Изменить (уменьшить) Gnome 3 горизонтальное заполнение значка в области уведомлений (Debian Wheezy) Изменить ulimit (открыть файлы) определенного процесса удаление ядер ядра Круговое соединение с Ethernet-соединением не работает, когда 1-й интерфейс Мультизагрузочный USB-накопитель с использованием относительных путей с помощью Syslinux (или другого загрузчика) тайм-аут

Добавить в сценарий оболочки

У меня есть файл test.txt, который имеет строку, как показано ниже

values = abc, def, dfg, ert, sdf, sfd, sdf 

Я использую сценарий оболочки для добавления нового значения с разделением запятыми в значениях в тесте, txt.

Например, мне нужно добавить «ghf» в test.txt:

 values = abc, def, dfg, ert, sdf, sfd, sdf, ghf 

Также мне нужно удалить значение.

Например, если мне нужно удалить «ert» в test.txt:

 values = abc, def, dfg, sdf, sfd, sdf, ghf 

Как я могу добиться этого в сценарии оболочки?

(то есть)

Если я дам

 echo "abc" >> test.txt 

Он может добавить «abc» в конец файла, но мне нужно добавить в поле «values ​​=» в test.txt

Спасибо,
Хари

    Быстрое решение без защиты от угловых случаев.
    (Спасибо Гленн Джекман за оптимизацию sed .)

    Добавление

    sed -i "/^values = / s/$/, ${NEW_VALUE}/" test.txt

    объяснение

    sed -i – внести изменения в данный файл, не печатать на стандартный stdout .

    /^values = / – Когда sed расположен на строке, которая начинается со values = .

    s/$/, ${NEW_VALUE}/ – Добавить , ${NEW_VALUE} в конце строки.

    test.txt – файл, над которым sed будет выполнять действия.

    Удаление

    sed -i "/^values = / s/ ${REMOVE_VALUE},\?//" test.txt

    объяснение

    s/ ${REMOVE_VALUE},\?// – Удалить первое вхождение ${REMOVE_VALUE} вместе с необязательным последующим ${REMOVE_VALUE}

    Проблемы с этим решением

    1. Добавление первого значения добавит сразу после values =
    2. Удаление последнего значения оставит строку, заканчивающуюся на.
    3. Если добавленные / удаленные переменные содержат разделитель sed для команды s (в моем примере это / ), команда не будет работать.

    Используя ed вы можете сделать следующее:

     ed -s test.txt <<<$'/values/s/$/,ghf\nw' # add ghf to the end of line 

    а также

     ed -s values <<<$'/values/s/ert,//\nw' # remove ert