É melhor usar um analisador XML com uma expressão XPath para modificar o arquivo XML. Um exemplo com xmlstarlet :
$ xmlstarlet edit -L -u "/connection/output[contains(., "Arturia")]" -v "remplacement_string" file.xml
Eu tenho essa string que recebo executando jack_lsp
.
a2j:Arturia BeatStep [28] (capture): Arturia BeatStep MIDI 1
em um arquivo xml, salvei o estado de conexões de uma sessão de jack anterior.
<connection>
<output>a2j:Arturia BeatStep [20] (capture): Arturia BeatStep MIDI 1</output>
<input>starmaze:midi_to_slave_1</input>
</connection>
Você deve ter notado que, entre a sessão anterior (salva no arquivo xml) e a sessão atual, o valor em []
(brakets quadrados) foi alterado.
asu como eu estou tentando atualizar o valor no arquivo sempre que eu quero carregá-lo.
Para fazer isso, eu tenho o seguinte snippet:
ARTURIA_CHAN=$( jack_lsp | grep Arturia | grep capture | sed -e 's/^.*\[\(.*\)\].*$//' )
ARTURIA_XMLCHAN=$( cat "${ofname}" | grep Arturia | grep capture | sed -e 's/^.*\[\(.*\)\].*$//' )
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
é o "nome do arquivo de saída" e é basicamente o arquivo xml.
As duas variáveis parecem obter os valores esperados (o que está dentro do []
), mas a operação sed não funciona corretamente ou não salva o arquivo no final. Eu não consigo descobrir que é assim. É mais evidente para você, talvez?
obrigado.
É melhor usar um analisador XML com uma expressão XPath para modificar o arquivo XML. Um exemplo com xmlstarlet :
$ xmlstarlet edit -L -u "/connection/output[contains(., "Arturia")]" -v "remplacement_string" file.xml