0

XML があり、ヘッダーの先頭に「-」があり、その下にタグ値があります。「_」を何も (NULL) に置き換えて、XML の 2 行目を削除する必要があります。<HEADER ASOF_DATE="2/15/2013" CREATE_DATE="2/17/2013" RECORDS="5">

XMLの各レコードのNAME列またはSHORT_DESC列の下に「&」がある場合とない場合があります..NAME列に存在する場合は「$$$」に置き換えてファイルを保存する必要があります...

以下はXMLファイルです..

- <HEADER>
- <HEADER ASOF_DATE="2/15/2013" CREATE_DATE="2/17/2013" RECORDS="5">
- <TAG>
<SHORT_DESC>XXX & CO MTN RegS</SHORT_DESC> 
<NAME>XXX & CO</NAME> 
</TAG>
- <TAG>
<SHORT_DESC>XYZ & DEV</SHORT_DESC> 
<NAME>XYZ & DEVELOP</NAME> 
</TAG>
- <TAG>
<SHORT_DESC>AB&C INC</SHORT_DESC> 
<NAME>AB&C INC</NAME> 
</TAG>
- <TAG>
<SHORT_DESC>AAA BBB & COMPANY</SHORT_DESC> 
<NAME>AAA BBB & COMPANY</NAME> 
</TAG>
- <TAG>
<SHORT_DESC>ABC XYZ</SHORT_DESC> 
<NAME>ABC XYZ</NAME> 
</TAG>
- </HEADER>

o/p は ..

<HEADER>
<TAG>
<SHORT_DESC>XXX $$$ CO MTN RegS</SHORT_DESC> 
<NAME>XXX $$$ CO</NAME> 
</TAG>
<TAG>
<SHORT_DESC>XYZ $$$ DEV</SHORT_DESC> 
<NAME>XYZ $$$ DEVELOP</NAME> 
</TAG>
<TAG>
<SHORT_DESC>AB$$$C INC</SHORT_DESC> 
<NAME>AB$$$C INC</NAME> 
</TAG>
<TAG>
<SHORT_DESC>AAA BBB $$$ COMPANY</SHORT_DESC> 
<NAME>AAA BBB $$$ COMPANY</NAME> 
</TAG>
<TAG>
<SHORT_DESC>ABC XYZ</SHORT_DESC> 
<NAME>ABC XYZ</NAME> 
</TAG>
</HEADER>

以下はコードです...しかし、変更を含むxmlファイルを保存していません

#!/usr/bin/perl

use strict;
use warnings;

my $tag = 'SHORT_DESC';

open my $fh, '<test.xml' or die $!;

foreach (<$fh>) {
  s/&/@@@/g;
  s/- //g;
  print $_;
}
close $fh;
4

1 に答える 1

0

読み取り用に開いているだけなので、ファイルを変更していません。

出力を書き込むには、別のファイルを開く必要があります。

#!/usr/bin/perl

use strict;
use warnings;

my $tag = 'SHORT_DESC';

open my $input_file, '<', 'test.xml' or die $!;
open my $output_file, '>', 'test_out.xml' or die $!;

my $input;
{
  local $/;               #Set record separator to undefined.
  $input = <$input_file>; #This allows the whole input file to be read at once.
}

$input =~ s/&/@@@/g;
$input =~ s/^- (?=<)//gm;
$input =~ s/<header[^>]*>\K\s*<header[^>]*>//gis;
print {$output_file} $input;

close $input_file or die $!;
close $output_file or die $!;

注: Perl ではファイルをその場で編集することができます。ただし、ほとんどの場合、別のファイルに書き込むことをお勧めします。テストにはより便利で安全です。オリジナルを失うリスクはありません。

私はあなたの正規表現を変更しました:

s/^- (?=<)//g

行の先頭でのみ削除するように を追加し、タグの前にある場合にのみ削除することを確認するために^先読み を追加しました。(?=<)

2 番目のタグの削除は<header>もう少し複雑です。それはあなたが正確に何をしたいかによって異なります。1 つのアプローチを次に示します。

s/<header[^>]*>\K\s*<header[^>]*>//gis;

空白だけで区切られた 2 つのヘッダー タグが見つかると、2 番目のタグが削除されます。\Kその前に一致したものは何でも保持します。したがって、2 番目のものだけが削除されます。

XML ファイルを有効な形式に変換したらすぐに、XML 解析モジュールを使用してそれ以上の操作を行う必要があります。 XML::Twig良いものです。

于 2013-04-29T10:37:26.843 に答える