Usando sed para substituir string por caracteres especiais no arquivo XML

4

Estou tendo dificuldade em obter sed para substituir uma cadeia de texto em um arquivo XML, apesar do fato de não ter problemas para usar o grep para encontrar a mesma cadeia de caracteres. Como a nova string e a string antiga a ser substituída contêm muitos caracteres especiais, achei melhor armazená-los em variáveis, em vez de usar uma série de barras invertidas:

OLD_STRING='<property name="webServiceHost">${jboss.bind.address}</property>'
NEW_STRING='<!--<property name="webServiceHost">${jboss.bind.address}</property>-->'

As strings parecem estar armazenadas como esperado:

$ echo $OLD_STRING; echo $NEW_STRING
<property name="webServiceHost">${jboss.bind.address}</property>
<!--<property name="webServiceHost">${jboss.bind.address}</property>-->

O Grep'ing confirma que a string antiga está presente no arquivo XML:

$ grep "$OLD_STRING" jboss-beans.xml
<property name="webServiceHost">${jboss.bind.address}</property>

Mas o seguinte comando sed não produz saída alguma:

sed -i 's/"$OLD_STRING"/"$NEW_STRING"/g' jboss-beans.xml

Alguma ideia do que me falta aqui?

    
por rolinrok 29.04.2011 / 22:26

2 respostas

2

Colocar variáveis de shell entre aspas simples desativa sua interpretação. É por isso que o seu comando não tem efeito.

$ echo  's/"$OLD_STRING"/"$NEW_STRING"/g'
s/"$OLD_STRING"/"$NEW_STRING"/g

Deve ser escrito assim:

sed -i "s/'$OLD_STRING'/'$NEW_STRING'/g" jboss-beans.xml

Mas as variáveis são interpretadas antes , chamando sed e novamente contendo caracteres especiais:

$ echo  "s/'$OLD_STRING'/'$NEW_STRING'/g"
s/'<property name="webServiceHost">${jboss.bind.address}</property>'/'<!--<property name="webServiceHost">${jboss.bind.address}</property>-->'/g

Por esse motivo, sed tem esse recurso especial que permite definir os delimitadores de comando s/// simplesmente usando-os, por exemplo:

sed -i "s#'$OLD_STRING'#'$NEW_STRING'#g" jboss-beans.xml

Ainda assim, sua expressão de pesquisa contém caracteres especiais de expressão regular e usar sed como isso é apenas um desperdício de suas habilidades. Eu escreveria a expressão assim:

sed -i 's/\(<.*webServiceHost.*jboss.bind.address.*>\)/<!---->/' jboss-beans.xml

É claro que você pode tornar a sequência de correspondência mais ou menos específica de acordo com suas necessidades. Há também outro recurso interessante que pode ajudar. sed permite restringir as operações de edição às linhas que correspondem a um padrão específico. Seu comando poderia ser assim:

sed -i '/webServiceHost/ s/^\(.*\)$/<!---->/' jboss-beans.xml
    
por 29.04.2011 / 23:42
0

Isso pode ser útil para você:
Manipulação XML Commandline no link

AFAICR
apt-get install xmlstarlet

    
por 09.08.2011 / 17:24