Adiciona o conteúdo do arquivo XML para outro usando o script bash

1

Eu tenho dois arquivos XML primeiro um ~/tmp/test.xml segundo /data/myuser/.mycontent/mytest.xml Eu quero adicionar todo o conteúdo no primeiro arquivo XML para a linha 35 no segundo. Eu tentei o seguinte, mas sem sorte

sed -n '35,~/tmp/test.xml'' /data/myuser/.mycontent/mytest.xml

(cat /data/myuser/.mycontent/mytest.xml; echo) | sed '35r ~/tmp/test.xml'

ed -s ~/tmp/test.xml <<< $'35r /data/myuser/.mycontent/mytest.xml\nw'

A linha 33 da segunda linha do arquivo XML 34 está vazia

#the following tags contain employee location

Tag XML no primeiro arquivo XML

<Location "/mylocation">
    first Address
    second Address

    Mylocation "XX/XX/XX/XX"
    Myphone "XXXXXXX"
</Location>

O que fiz de errado, por favor, avise.

Editar 1

primeiro arquivo XML ~/tmp/test.xml contém apenas

<Location "/mylocation">
    first Address
    second Address

    Mylocation "XX/XX/XX/XX"
    Myphone "XXXXXXX"
</Location>

segundo XML /data/myuser/.mycontent/mytest.xml contém:

NameVirtualHost *:XXXX
<VirtualHost  *:XXXX>

    ServerName AAAAAAAA

# Manager comment 1
# Manager comment 2
# Manager comment 3
#
DocumentRoot "/data/myuser/.mycontent/"

# support email [email protected]
# started at 2010
<employee /*>
        AllowOverride None
</employee>

<Location "/">
        mylocation
        Deny from all
</Location>

<Location "/icons/">
#        employee info
        my employee info
        Allow from all
</Location>

DavLockDB /tmp/${APACHE_HOSTNAME}.DavLock
DAVMinTimeout 5000
LimitXMLRequestBody 0

# This should be changed to whatever you set DocumentRoot to.

## I need to add new tags here ##
<Location "/employee1">
    first Address
    second Address

    Mylocation "XX/XX/XX/XX"
    Myphone "XXXXXXX"
</Location>

<Location "/employee2">
    first Address
    second Address

    Mylocation "XX/XX/XX/XX"
    Myphone "XXXXXXX"
</Location>
## more tags same as above
## then manager comment

Editar 2 segundo arquivo /data/myuser/.mycontent/mytest.xml deve ser como:

 NameVirtualHost *:XXXX
    <VirtualHost  *:XXXX>

        ServerName AAAAAAAA

    # Manager comment 1
    # Manager comment 2
    # Manager comment 3
    #
    DocumentRoot "/data/myuser/.mycontent/"

    # support email [email protected]
    # started at 2010
    <employee /*>
            AllowOverride None
    </employee>

    <Location "/">
            mylocation
            Deny from all
    </Location>

    <Location "/icons/">
    #        employee info
            my employee info
            Allow from all
    </Location>

    DavLockDB /tmp/${APACHE_HOSTNAME}.DavLock
    DAVMinTimeout 5000
    LimitXMLRequestBody 0

    # This should be changed to whatever you set DocumentRoot to.

    ## I need to add new tags here ##
  ## this tag from first file   
  <Location "/mylocation">
        first Address
        second Address

        Mylocation "XX/XX/XX/XX"
        Myphone "XXXXXXX"
    </Location>

  ## edit end

    <Location "/employee1">
        first Address
        second Address

        Mylocation "XX/XX/XX/XX"
        Myphone "XXXXXXX"
    </Location>

    <Location "/employee2">
        first Address
        second Address

        Mylocation "XX/XX/XX/XX"
        Myphone "XXXXXXX"
    </Location>
    ## more tags same as above
    ## then manager comment

Nota: ## this tag from first file e ## edit end para especificar a localização da localização de fusão

    
por Ahmad Abuhasna 27.12.2015 / 17:22

3 respostas

1

OK, isso não é XML inserido em XML como eu pensava - se fosse, a resposta seria 'use um analisador'. No entanto, não é, você está apenas mesclando um arquivo de texto em outro.

Então, eu quebraria o perl como muitas vezes faço:

#!/usr/bin/env perl
use strict;
use warnings;

open ( my $insert, '<', '~/tmp/test.xml' ) or die $!;
open ( my $modify, '<', '/data/myuser/.mycontent/mytest.xml' ) or die $!; 
open ( my $output, '>', '/data/myuser/.mycontent/mytest.xml.new' ) or die $!; 

select $output; 
while ( <$modify> ) { 
   if ( $. == 32 ) { print <$insert>; }; 
   print; 
}

Isso deve fazer o truque - se você está atrás de um forro, então pode ser resumido em:

perl -p -i.bak -e 'BEGIN { open ( $insert, "<", shift ) } if ( $. == 32 ) { print <$insert> }' ~/tmp/test.xml /data/myuser/.mycontent/mytest.xml

Observe que $. é perl para "número da linha atual". Você pode aplicar um tipo diferente de condicional, se preferir. Como se um regex corresponde (o que pode ser mais apropriado, dado arquivos de configuração tendem a receber linhas inseridas neles).

    
por 29.12.2015 / 11:07
2

Com o GNU sed:

Se você deseja inserir file1.xml em file2.xml na linha 35 com uma nova linha principal:

sed -e '34{p;g;r file1.xml' -e '}' file2.xml

Se você quiser editar file2.xml "no lugar", adicione a opção sed -i .

    
por 27.12.2015 / 18:50
0

Acho que entendi o problema com o que você está tentando fazer. Parece que você talvez queira inserir seu arquivo r ead em uma sugestão de entrada. Você diz a linha 35, mas se você usar sed 35r\ file será anexado a 35 . É difícil assistir a entrada para uma sugestão antes da qual você deseja gravar a saída se não for seguro. Por exemplo:

sed -e'$!N;/\n<Location "\/employee1">/r /tmp/file1' \
    -eP\;D </tmp/file2 | tail -n30

Agora que verifica a entrada para o <Location /employee1> e insere o conteúdo de file1 imediatamente antes de ser encontrado.

DAVMinTimeout 5000
LimitXMLRequestBody 0

# This should be changed to whatever you set DocumentRoot to.

## I need to add new tags here ##
<Location "/mylocation">
    first Address
    second Address

    Mylocation "XX/XX/XX/XX"
    Myphone "XXXXXXX"
</Location>
<Location "/employee1">
    first Address
    second Address

    Mylocation "XX/XX/XX/XX"
    Myphone "XXXXXXX"
</Location>

<Location "/employee2">
    first Address
    second Address

    Mylocation "XX/XX/XX/XX"
    Myphone "XXXXXXX"
</Location>
## more tags same as above
## then manager comment
    
por 29.12.2015 / 11:55

Tags