Inserindo um texto entre 2 padrões

4

Eu tenho um arquivo .xml que contém o abaixo

<controller-host></controller-host>
 <controller-port></controller-port>
<tier-name></tier-name>
<node-name></node-name>

Eu quero a saída como esta

<controller-host>AppDynamicsHost</controller-host>
 <controller-port>80</controller-port>
<tier-name>**the host name**</tier-name>
<node-name>tomcat server</node-name>

Eu tentei usar sed , mas não consegui.

    
por Siraj Syed 22.10.2015 / 18:00

3 respostas

3

O arquivo que é dado não é válido xml. Você precisa adicionar as tags raiz de abertura e fechamento. Assim:

<xml>
  <controller-host></controller-host>
  <controller-port></controller-port>
  <tier-name></tier-name>
  <node-name></node-name>
</xml>

Com essa entrada, você pode usar um analisador xml como xmlstartlet para editar o conteúdo:

xmlstarlet ed -O -u //controller-host -v "AppDynamicsHost" \
                 -u //controller-port -v "80" \
                 -u //tier-name -v "the hostname" \
                 -u //node-name -v "tomcat server" file
  • ed iniciar o modo de edição de xmlstartlet
  • -O omite a declaração <?xml version="1.0"?>
  • -u atualiza o xpath fornecido
  • -v define o valor fornecido

A saída seria então:

<xml>
  <controller-host>AppDynamicsHost</controller-host>
  <controller-port>80</controller-port>
  <tier-name>the hostname</tier-name>
  <node-name>tomcat server</node-name>
</xml>

Para editar o arquivo diretamente no local, você pode usar o sinalizador -L .

    
por 22.10.2015 / 18:40
1

Você pode tentar algo assim:

$host='hostname'

sed -i 's/<controller-host><\/controller-host>/<controller-host>AppDynamicsHost<\/controller-host>/' yourfile.xml
sed -i 's/<controller-port><\/controller-port>/<controller-port>80<\/controller-port>' yourfile.xml
sed -i "s/<tier-name><\/tier-name>/<tier-name>${host}<\/tier-name>/' yourfile.xml
sed -i 's/<node-name><\/node-name>/<node-name>tomcat server<\/node-name>/' yourfile.xml

A sinalização -i significa gravar o resultado no seu arquivo, tente executar isso sem o -i durante o teste.

    
por 22.10.2015 / 18:09
1

Como o caos disse, tornar o arquivo um arquivo XML válido e usar xmlstarlet ou ferramenta de processamento xml semelhante (por exemplo, xsh ) é a resposta "certa" ... mas se você quer apenas fazer modelos simples, modificaria seu arquivo de entrada para ter tokens facilmente encontrados e substituíveis nos locais que você deseja alterar. Por exemplo:

<controller-host>__CONTROLLER__</controller-host>
 <controller-port>__PORT__</controller-port>
<tier-name>__HOSTNAME__</tier-name>
<node-name>__NODENAME__</node-name>

Em seguida, você pode usar qualquer uma das ferramentas usuais (awk, sed, perl, ruby, etc.) para substituir __CONTROLLER__ etc pelos valores reais que você deseja que eles tenham.

OBSERVAÇÃO: é muito importante usar strings que, de outra forma, não ocorrem no texto. Por isso, usei __ como parte das strings substituíveis, por exemplo, __PORT__ em vez de apenas PORT .

Isso funciona para necessidades de modelos muito simples - se você precisa fazer modelos mais complicados, muitos idiomas têm bibliotecas de modelos muito sofisticadas - por exemplo, perl tem Text::Template (e muitos outros - é um problema comum que inspirou muitas soluções)

    
por 23.10.2015 / 02:52

Tags