내 파일에 식별할 수 없는 데이터가 포함되어 있습니다. 다음과 같이 말해보세요:
<?xml version="1.0" encoding="UTF-8" ?><ns0:collection
xmlns:ns0="http://namspace/Service/1.0"><Record>
.
.</Record></ns0:collection>
N개의 파일을 병합하여 하나의 파일을 만들어야 합니다. 그래서 다음을 수행해야 합니다.
</ns0:collection>
첫 번째 파일에서 닫는 태그를 제거하면 됩니다 .- 다음 (n-1)개 파일의
<?xml version="1.0" encoding="UTF-8" ?><ns0:collection xmlns:ns0="http://namspace/Service/1.0">
합계 삭제</ns0:collection>
- 마지막 파일 만 삭제
<?xml version="1.0" encoding="UTF-8" ?><ns0:collection xmlns:ns0="http://namspace/Service/1.0">
하고 모두 병합해야 합니다.
명령을 사용하여 첫 번째 파일을 처리하려고 시도했지만 sed
결과가 나오지 않았습니다. "merged.xml"은 비어 있었습니다.
sed '/<\/ns0:collection>/d' $file1 > merged.xml
어떤 제안이 있으십니까?
답변1
use 만 지정하지 않았 sed
으므로 액세스 권한이 있는 경우 xml_grep
(참조명령줄에서 여러 XML 파일 병합, 두 번째 답변), 이것은 여러분에게 많은 부담을 주고 다음과 같은 간단한 병합 작업을 단일 명령으로 수행할 수 있기 때문에 이것을 권장합니다.
xml_grep --cond Record --wrap "ns0:collection" --descr 'xmlns:ns0="http://namespace/Service/1.0"' --encoding "UTF-8" *.xml
테스트 파일:
테스트.xml
<?xml version="1.0" encoding="UTF-8" ?><ns0:collection
xmlns:ns0="http://namespace/Service/1.0""><Record>
Test
</Record></ns0:collection>
테스트1.xml
<?xml version="1.0" encoding="UTF-8" ?><ns0:collection
xmlns:ns0="http://namespace/Service/1.0"><Record>
Test 1<a>a</a><b c="c">d</b>
</Record></ns0:collection>
결과
<?xml version="1.0" encoding="UTF-8" ?>
<ns0:collection xmlns:ns0="http://namespace/Service/1.0">
<Record>
Test 1<a>a</a><b c="c">d</b></Record><Record>
Test
</Record>
</ns0:collection>
XML 파일로 작업할 때 구조를 망칠 가능성이 sed
매우 높고 잘못된 형식의 XML 문서가 되기 쉽기 때문에 XML 인식 도구를 사용하는 것을 선호합니다!
답변2
sed
XML 처리에 적합하지 않은 using을 사용하고 대신 파서를 사용하는 것이 좋습니다 .
또한 여기에 XY 문제가 있다고 제안합니다. 태그를 제거하는 것이 아니라 XML 파일을 병합하는 것입니다.
개인적으로 - 나는 perl
다음을 좋아한다 XML::Twig
:
#!/usr/bin/env perl
use strict;
use warnings;
#load the parser
use XML::Twig;
#get our file list - we use the "first" file as the basis.
#can use sort on this list if desired.
my ( $first_file, @other_files ) = glob ( 'C://tmp//xmltest/*.xml' );
#Our 'parent' document.
my $doc = XML::Twig -> new -> parsefile ( $first_file );
foreach my $file ( @other_files ) {
my $mergedoc = XML::Twig -> new -> parsefile ( $file );
#//Record means any <Record> node anywhere in the tree.
foreach my $record ( $mergedoc -> get_xpath ( '//Record' ) ) {
$record -> cut;
#paste it into our parent doc, as the last node.
$record -> paste ( after => $doc -> root -> last_child );
}
}
#set output formatting (optional)
$doc -> set_pretty_print ('indented_a');
#print to STDOUT.
$doc -> print;
#write to output file too
open ( my $output, '>', 'combined.xml' ) or die $!;
print {$output} $doc -> sprint;
close ( $output );
이는 의도적으로 대상 XML에서 요소를 추출하여 Record
문서 간에 병합합니다. 그러나 이는 xpath
매우 강력하고 정규 표현식과 동일한 XML과 같은 유연한 접근 방식이지만 정규 표현식은 그렇지 않은 반면 컨텍스트를 인식하므로 더 좋습니다.
답변3
해결책:
첫 번째 파일에서 닫는 태그만 제거해야 합니다. 해결 방법:
sed -i.bak -e 's/<\/ns0:collection>/ /' -e 's/<\/Record>/ /' n0
다음 (n-1) 파일의 합계를 삭제합니다
<?xml version="1.0" encoding="UTF-8" ?><ns0:collection xmlns:ns0="http://namspace/Service/1.0">
.</ns0:collection>
sed -i.bak -e 's/<?xml version=1.0 encoding=UTF-8 ?>.*<ns0:collection/ /' -e 's/xmlns.*/ /' -e 's/<\/R.*>.*>/ /' n1
다양한 파일 이름에 대해 다음을 수행하십시오.
find . -type f -name "n[1-3]" -exec sed i.bak -e 's/<?xml version=1.0 encoding=UTF-8 ?>.*<ns0:collection/ /' -e 's/xmlns.*/ /' -e 's/<\/R.*>.*>/ /' {} \;
마지막 파일만 제거하고 모두 병합해야 합니다.
sed i.bak -e 's/<?xml version=1.0 encoding=UTF-8 ?>.*<ns0:collection/ /' -e 's/xmlns.*/ /' ne
마지막으로 합류하세요:
cat n0 n[1-3] ne > joined
n0
, n1
, n2
및 . 파일을 사용했습니다 n3
. ne
각 내용에 다음 텍스트를 추가했습니다.
<?xml version="1.0" encoding="UTF-8" ?><ns0:collection
xmlns:ns0="http://namspace/Service/1.0"><Record>
hello from nigeria
</Record></ns0:collection>
생성된 파일은 joined
다음과 같습니다.
<?xml version="1.0" encoding="UTF-8" ?><ns0:collection
xmlns:ns0="http://namspace/Service/1.0"><Record>
hello from nigeria
hello from nigeria
hello from nigeria
hello from nigeria
hello from nigeria
</Record></ns0:collection>
노트:
첫 번째 질문에서 둘
</Record></ns0:collection>
모두뿐만 아니라</ns0:collection>
.</Record>
모든 파일에 대해 하나의 명령을 실행할 수 있도록 여기의 파일 이름을 수정해야 합니다
n[1-3]
. 여기서는 가장 적합한 이름을 선택했습니다.먼저 테스트를 실행하고 결과를 확인해 보세요., 여기서는 자동으로 백업을 생성하는 데 사용합니다
i.bak
.sed