使用字符串文字的Bash变量通过Perl行传递给Regex表达式

时间:2014-11-07 20:15:03

标签: regex bash perl

使用字符串文字的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'替换为逻辑?

1 个答案:

答案 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