заменяя некоторый текст квадратными скобками в bash

У меня есть эта строка, которую я получаю от запуска jack_lsp .

 a2j:Arturia BeatStep [28] (capture): Arturia BeatStep MIDI 1 

в xml-файле я сохраняю состояние соединений из предыдущего сеанса подключения.

 <connection> <output>a2j:Arturia BeatStep [20] (capture): Arturia BeatStep MIDI 1</output> <input>starmaze:midi_to_slave_1</input> </connection> 

Возможно, вы заметили, что между предыдущим сеансом (сохраненным в файле xml) и текущим сеансом значение в [] (квадратные скобки) было изменено. asu такой я пытаюсь обновить значение в файле всякий раз, когда я хочу его загрузить.

Для этого у меня есть следующий фрагмент bash:

 ARTURIA_CHAN=$( jack_lsp | grep Arturia | grep capture | sed -e 's/^.*\[\(.*\)\].*$/\1/' ) ARTURIA_XMLCHAN=$( cat "${ofname}" | grep Arturia | grep capture | sed -e 's/^.*\[\(.*\)\].*$/\1/' ) if [ "${ARTURIA_CHAN}" != "${ARTURIA_XMLCHAN}" ]; then sed -e "s/\[$ARTURIA_XMLCHAN\]/\[$ARTURIA_CHAN\]/g" -i.bak1-art "${ofname}" echo "changing arturia from ${ARTURIA_XMLCHAN} to ${ARTURIA_CHAN}" fi 

ofname – это «имя выходного файла», и это в основном файл xml.

Кажется, что переменные 2 получают ожидаемые значения (что находится внутри [] ), но операция sed либо работает неправильно, либо не сохраняет файл в конце. Я не могу понять, что это правда. Возможно, это более очевидно для вас?

Спасибо.

  • Извлечение значений из блока данных
  • Найти регулярное выражение для метки времени в имени файла не работает
  • Удаление последнего символа одним словом, но только если символ присутствует - в bash
  • Улучшить команду sed для замены первого экземпляра символа и всех следующих символов?
  • Недопустимый код команды с sed
  • Перенаправление sed для завивки, затем в файл
  • Создайте список каждого пользователя, которому принадлежит файл в заданном каталоге, а также количество файлов и каталогов, которыми они владеют.
  • Замена определенного номера в файлах unix
  • One Solution collect form web for “заменяя некоторый текст квадратными скобками в bash”

    Лучше использовать XML-парсер с выражением XPath для изменения файла XML. Один пример с xmlstarlet :

     $ xmlstarlet edit -L -u "/connection/output[contains(., "Arturia")]" -v "remplacement_string" file.xml 
    Linux и Unix - лучшая ОС в мире.