以下のテキストファイルがあります。
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>//'
2番目の問題で解決され、現在の問題は次に解決されます。
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
「スタートNext正規表現はここで一致します。 "一致するものがない場合、正規表現は0(false)を返し、ループを終了してwhile
コドンが出力を印刷できるように@w
します。検索範囲が本質的に数字と等号であると仮定します。