substituindo algum texto em brakets quadrados no bash

0

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.

    
por nass 15.12.2014 / 01:16

1 resposta

2

É melhor usar um analisador XML com uma expressão XPath para modificar o arquivo XML. Um exemplo com :

$ xmlstarlet edit -L -u "/connection/output[contains(., "Arturia")]" -v "remplacement_string" file.xml
    
por 15.12.2014 / 01:35

Tags