文件内容示例
cat File.txt
RHO_BID_RT
RHO_ASK_RT
XML文件内容
<field name="RHO_BID_RT" type="float" id="0x01D3" sequence="1"/>
<field name="RHO_ASK_RT" type="float" id="0x01D4" sequence="1"/>
PERL CODE
perl -pe 'BEGIN { $re = join "|", map { chomp; quotemeta } `cat File.txt` } s/<[^>]+ "field name="($re)"[^>]+>/<!! REMOVED $1 -->/g' fields.xml
不确定为什么我没有得到预期的结果
<!-- Removed RHO_BID_RT-->
<!-- Removed RHO_ASK_RT-->
答案 0 :(得分:4)
如果您对使用XML::Twig
解析XML的Perl程序感兴趣,并使用具有任何给定名称的所有field
元素替换注释,那么这符合该法案。< / p>
use strict;
use warnings;
use XML::Twig;
use List::Util 'any';
my @names = do {
local @ARGV = 'File.txt';
map { chomp; $_; } <>;
};
my $twig = XML::Twig->new( pretty_print => 'indented', );
$twig->parsefile('fields.xml');
for my $field ( $twig->get_xpath('field') ) {
my $name = $field->att('name');
if ( any { $name eq $_ } @names ) {
my $comment = XML::Twig::Elt->new('#COMMENT' => " Removed $name ");
$comment->paste(after => $field);
$field->cut;
}
}
$twig->print;
当File.txt
如您所述并且fields.xml
包含此
<root>
<field name="RHO_AAA_RT" type="float" id="0x01D1" sequence="1"/>
<field name="RHO_BID_RT" type="float" id="0x01D2" sequence="1"/>
<field name="RHO_ASK_RT" type="float" id="0x01D3" sequence="1"/>
<field name="RHO_ZZZ_RT" type="float" id="0x01D4" sequence="1"/>
</root>
产生此输出
<root>
<field id="0x01D1" name="RHO_AAA_RT" sequence="1" type="float"/>
<!-- Removed RHO_BID_RT -->
<!-- Removed RHO_ASK_RT -->
<field id="0x01D4" name="RHO_ZZZ_RT" sequence="1" type="float"/>
</root>
答案 1 :(得分:2)
在field name
之前有一个双引号,而xml中没有。此外,您在字段名称前面有空格,并使用+
量词,这至少需要一个不是>
的字符。
修改上述内容后,下面的单行内容按预期工作。请注意,这是Windows,因此我已经“翻译”了某些内容。
perl -pwe"BEGIN { $re = join '|', map { chomp; quotemeta } qx(type file.txt); } s/<[^>]*field name=\x22($re)\x22[^>]+>/<!! REMOVED $1 -->/g" fields.xml
<!! REMOVED RHO_BID_RT -->
<!! REMOVED RHO_ASK_RT -->