使用字符串文字的Bash变量通过Perl行传递给Regex表达式:
我有一个Bash脚本,可以通过RegEx语句对XML文件进行一些编辑。该语句在Perl中运行良好,但在Bash中运行不正常,但问题是将变量传递到Regex语句的替换部分。使用字符串文字都很好,但由于需要编程,因此不实用。下面是一个小片段。
示例XML Test.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<NodeA>12345678</NodeA>
<NodeB>5551212</NodeB>
<NodeC>a1fea1f8</NodeC>
</Root>
示例适用于文字字符串:
xml=`cat Test.xml`
value="TESTttt"
# Perl flavor
new_xml=`echo ${xml} | perl -ne 's/(\<NodeB\>).*?(\<\/NodeB\>)/\1New_String\2/m;print $_'`
如何将变量value
传递给Regex语句的替换字符串,将'New_String'替换为逻辑?
答案 0 :(得分:3)
不要那样做。字符串插值和将shell送入perl是一件很脏的事情。特别是对于XML,这是一种具有非常严格规范的数据格式。 Perl有一些很好的XML解析选项。
尝试这样的事情:
#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;
my $twig = XML::Twig->new();
{
local $/;
$twig->parse(<DATA>);
}
my $NodeB = $twig->root->first_child('NodeB');
my $old_text = $NodeB->text();
print $old_text, "\n";
$NodeB->set_content('Some New Text');
$twig->set_pretty_print('indented');
$twig->print;
__DATA__
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<NodeA>12345678</NodeA>
<NodeB>5551212</NodeB>
<NodeC>a1fea1f8</NodeC>
</Root>
(您可以使用parsefile
来阅读text.xml
,我只是为了示例而将其内联为DATA
。