Como adicionar uma linha de uma lista em outro arquivo quando uma linha especificada é encontrada?

4

Basicamente eu tenho 2 arquivos. Um deles tem uma lista de prompts de login do roteador e do switch, assim:

user@router1
user@router2
user@switch1
user@switch2

O outro arquivo tem blocos de XML, como este:

<headTag>
    <anotherTag1>
    <anotherTag2>
    </anotherTag2>
    </anotherTag1>
</headTag>
<headTag>
    <anotherTag1>
    <anotherTag2>
    </anotherTag2>
    </anotherTag1>
</headTag>

Então, o que eu quero fazer é isso, eu preciso dar um loop no arquivo XML e cada vez que ele detecta <headTag> coloque o próximo item na lista de roteadores / switches na linha acima dele, então a saída final terminaria assim:

user@router1
<headTag>
    <anotherTag1>
    <anotherTag2>
    </anotherTag2>
    </anotherTag1>
</headTag>
user@router2
<headTag>
    <anotherTag1>
    <anotherTag2>
    </anotherTag2>
    </anotherTag1>
</headTag>

Como posso conseguir isso? Estou usando o Red Hat Enterprise Linux Server e tenho aproximadamente 800 itens na lista de roteadores / comutadores e o mesmo número de blocos XML.

    
por SJB 23.05.2013 / 13:17

2 respostas

4

Aqui, outra solução curta com sed e ed .

Modifique o arquivo XML inplace . Ignore a saída para o console.

sed -e 's#.*#/<headTag>/i\n&\n.\n//\nw#' PATH_TO_LIST_FILE | ed PATH_TO_XML_FILE

A linha de comandos sed grava os seguintes comandos Ed para cada linha no arquivo de lista:

/<headTag>/i                # search for tag and insert before
user@router1                # text to insert (= the current line in the list file)
.                           # end of insert
//                          # skip current tag (we are now on the line above the current tag))
w                           # save (could be postponed to the end, but makes the command shorter...)

Para este comando, é necessário que <headTag> esteja sempre no começo de uma linha no arquivo xml.

    
por 23.05.2013 / 14:51
0

Aqui você vai:

perl -MTie::File -e '
$xml_file_name="path_to_xml_file";
$list_file_name="path_to_list_file";
tie @xml_lines,"Tie::File",$xml_file_name;
tie @list_lines,"Tie::File",$list_file_name;
@offsets = grep {$xml_lines[$_]=~/\Q<headTag>\E/} (0..$#xml_lines);
@offsets=reverse @offsets;
splice @xml_lines,pop @offsets,0,pop @list_lines;'

Diclaimer

  • Esse código modificará seu arquivo XML no lugar. Faça uma cópia de backup se você não quiser que o original tenha sido corrompido.
  • Este código é não testado . Faça backup dos dois arquivos antes de tentar.

Editar

Corrigido um erro de digitação: observe o til adicionado ~ na linha 6.

    
por 23.05.2013 / 13:27