【问题标题】:Using Bash variable for string literal to pass to a Regex expression through Perl line使用 Bash 变量作为字符串文字通过 Perl 行传递给正则表达式
【发布时间】:2014-11-07 20:15:03
【问题描述】:

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

我有一个 Bash 脚本,可以通过 RegEx 语句对 XML 文件进行一些编辑。该语句在 Perl 中效果很好,但在 Bash 中效果不佳,但问题是将变量传递到 Regex 语句的替换部分。使用字符串文字都很好,但不实用,因为需要编程。下面是一个小sn-p。

示例 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' 替换为合乎逻辑的?

【问题讨论】:

  • Perl 可能使用了argv 构造。

标签: regex bash perl


【解决方案1】:

不要那样做。字符串插值和将 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)。

【讨论】:

  • Sobrique,这似乎是一个很好的解决方案并简化了流程。该解决方案运行良好,但会在周末扩大使用范围。
  • 有时会出现边缘情况,您需要权衡一种方法的能力与另一种方法的熟悉度和经验。但是,当您扩展您正在尝试做的事情时 - 纯 perl 相对于 shell 脚本的优势开始显现。
猜你喜欢
  • 2011-03-09
  • 2016-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-27
  • 1970-01-01
  • 2010-12-19
相关资源
最近更新 更多