Bash 스크립트를 사용하여 XML 파일의 내용을 다른 파일에 추가

Bash 스크립트를 사용하여 XML 파일의 내용을 다른 파일에 추가

두 개의 XML 파일이 있습니다. 첫 번째는 ~/tmp/test.xml두 번째이고 /data/myuser/.mycontent/mytest.xml첫 번째 XML 파일의 모든 내용을 두 번째 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'

두 번째 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>

두 번째 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 두 번째 파일은 /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에 삽입하는 것이 아닙니다. 그렇다면 대답은 "파서를 사용하십시오"일 것입니다. 그러나 이는 사실이 아니며 단지 하나의 텍스트 파일을 다른 텍스트 파일로 병합하는 것입니다.

그래서 평소대로 할게요 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

관련 정보