텍스트 파일에서 XML을 추출하는 방법

텍스트 파일에서 XML을 추출하는 방법

아래와 같은 텍스트 파일이 있습니다.

1001=<?xml ns=dkfj><home><taga>dkjf</taga></home>1002=<?xml ns=dkfj><home1><taga>dkjf</taga></home1>

다음 결과가 필요합니다.

 <?xml ns=dkfj><home><taga>dkjf</taga></home>

 <?xml ns=dkfj><home1><taga>dkjf</taga></home1>

나는 전에 시도했다sed, 패턴을 시작하고 끝내려고 하는데 둘 다 같은 줄에 있기 때문에 작동하지 않습니다.

어떻게 해야 합니까?

답변1

원래 문제는
cat test.xml | tr "<" "\n" | sed -n '/taga>./p' | sed 's/taga>//'
두 번째 문제로 해결되고 현재 문제는 다음으로 해결됩니다.
cat test.xml | sed 's/[0-9][0-9][0-9][0-9]=/\n/g'

4자리 숫자 다음에 = 기호가 나타나는지 검색하므로 실제 문자열의 다른 곳에 이러한 유형의 문자가 있을 수 있으면 작동하지 않지만 지금은 그렇지 않은 것 같습니다.

답변2

코드 조각을 보면 "number="로 구분된 XML이 있는 것 같습니다. 따라서 분할을 사용하여 다음을 추출합니다.

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

use Data::Dumper;

local $/;
my @xml_chunks = split ( /\d+\=/, <> );
print Dumper \@xml_chunks;

물론, 여러분의 XML은... 그렇지 않다는 점에 유의해야 합니다. 이 문은 유효하지 않습니다. 그러나 나는 이것이 전치 오류라고 가정합니다. 하지만 그것은~해야 한다다음과 같습니다:

<?xml version="1.0" encoding="utf-8"?>

따라서 예제 데이터의 경우 이는 XML을 수정하는 합리적인 근사치입니다(물론 유효하지 않다고 가정).

#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
use Data::Dumper;

local $/;
my @xml_chunks = split( /\d+\=/, <DATA> );
print Dumper \@xml_chunks;

foreach my $chunk ( grep {/xml/} @xml_chunks ) {
    $chunk =~ s/^<[^>]+>//;
    my $twig = XML::Twig->new( pretty_print => 'indented_a' );
    $twig->parse($chunk);
    $twig->set_encoding('utf-8');
    $twig->set_xml_version('1.0');
    $twig->root->set_att( 'xmlns', 'http://www.some_ns.com' );
    $twig->print;
}

답변3

내 생각에는 sed가 작동할 것 같지만 Perl 솔루션을 만들겠습니다.

 perl -ane 'while (/(<\?xml.*?>)($|\d+=)/g) { push @w,$1; }' \
        -e 'print join("\n",@w)."\n";@w=();'

Perl의 정규식 작업은 /g"시작다음정규식은 여기에서 일치합니다." 일치하는 항목이 없으면 정규식은 0(false)을 반환하고 루프를 종료하여 while코돈이 출력을 인쇄할 수 있도록 합니다. 동시에 일치 항목은 배열에 누적되며 @w이를 지워야 합니다. 정규식에서는 검색 범위가 본질적으로 숫자와 등호라고 가정합니다.

관련 정보