Bashスクリプトを使用してXMLファイルの内容を別のファイルに追加する

Bashスクリプトを使用してXMLファイルの内容を別のファイルに追加する

2つのXMLファイルがあります。最初は~/tmp/test.xml2番目で、/data/myuser/.mycontent/mytest.xml最初のXMLファイルのすべての内容を2番目のXMLファイルの35行目に追加しようとしています。以下を試してみましたが、運がありませんでした。

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'

2番目のXMLファイルの34行目のうち33行目は空です。

#the following tags contain employee location

最初のXMLファイルのXMLタグ

<Location "/mylocation">
    first Address
    second Address

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

私が何を間違っているのかアドバイスをお願いします。

編集1

最初のXML~/tmp/test.xmlファイルに

<Location "/mylocation">
    first Address
    second Address

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

2番目のXMLには次のもの/data/myuser/.mycontent/mytest.xmlがあります。

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

編集2 2番目のファイルは/data/myuser/.mycontent/mytest.xml次のようにする必要があります。

 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

注:マージの場所を指定## this tag from first fileしてください。## edit end

答え1

GNU sedの使用:

file2.xmlの35行目に改行文字を使用してfile1.xmlを挿入するには、次のようにします。

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

file2.xmlを「所定の位置」で編集するには、sedにオプションを追加します-i

答え2

さて、私が思ったように、XMLをXMLに挿入するのではありません。もしそうなら、答えは「パーサーを使用してください」です。しかし、これは事実ではなく、1つのテキストファイルを別のテキストファイルにマージするだけです。

だからいつものようにしますperl

#!/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; 
}

これはトリックを実行する必要があります。パッドが必要な場合は、次のように圧縮できます。

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

$.「現在行番号」を参照してくださいperl。必要に応じてさまざまな種類の条件を適用できます。正規表現が一致する場合と同じです(これはより適切であり、特定のプロファイルが行を挿入する傾向があります)。

答え3

私はあなたがしようとしている問題を理解していると思います。r入力プロンプトにeadファイルを挿入したいようです。 35行目だと言いましたが、そうすればsed 35r\ fileに追加されます35。プロンプトの入力を観察することは困難です。今後予測を保証しない場合は、出力を作成する必要があります。たとえば、

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

ここで入力をスキャンします。<Location /employee1>file1コンテンツを見つける直前に挿入します。


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

関連情報