【问题标题】:Store XML tag to Perl variable in shell将 XML 标记存储到 shell 中的 Perl 变量
【发布时间】:2014-05-23 00:59:32
【问题描述】:

我正在运行awk 命令以从文件中提取 XML 标记,它在我的控制台中成功运行并打印输出所需的标记

awk '/<tag name="some_name">/,/<\/tag>/' file

现在我需要在 Perl 脚本中调用此命令并将控制台中的输出传递给此变量,以便使用 Perl 操作此结构。

我试过了

my $var=`awk '/<tag name="some_name">/,/<\/tag>/' file`

但这不起作用,我有这个错误

awk: cmd. line:1: /<tag name="some_name">/,/</tag>/
awk: cmd. line:1:                                                 ^ unexpected newline or end of string

我怎样才能修改这个变量分配,甚至使用其他方法来解决我的问题。 我对所有提议持开放态度,即使一开始不使用 awk 并且只使用 Perl。

【问题讨论】:

  • 嗯,既然 Perl 本身也能做到,为什么还要费心从 Perl 中调用 awk 命令呢?事实上,甚至还有 a2p (Awk to Perl)
  • @vogomatix 我知道 awk 只用一个命令就可以做到这一点,所以我选择了 awk,如果可以在 perl 中使用这个命令,那就更好了,我如何使用 a2p这个?

标签: xml perl shell awk


【解决方案1】:

我建议使用实际的 xml 解析器,例如 XML::LibXMLXML::Twig

use strict;
use warnings;

use XML::LibXML;

my $dom = XML::LibXML->load_xml(
    location => 'file'
);

my @nodes = $dom->findnodes(q{//tag[@name="some_name"]});

print $nodes[0]->textContent();

【讨论】:

  • 比其他答案更强大的解决方案,包括我自己的 :-)
【解决方案2】:

引用有点棘手。我对命令本身使用了q 运算符(请参阅perldoc perlop),并使用qx 代替了等效的反引号。

my $cmd = q(awk '/<tag name="some_name">/,/<\/tag>/' file);
my $var = qx($cmd);

我建议改用 XML 解析器,例如 XML::Twig

【讨论】:

    【解决方案3】:

    我稍后会编辑它,因为我不在运行 Perl 的系统上,但这样的东西可以避免使用 awk...

    open FILE, "file" or die "Couldn't open file: $!";
    $slurp = <FILE>;
    if ($slurp =~ /<tag name="some_name">(.*)<\/tag>/) {
        $var = $1;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-27
      • 2011-08-11
      • 1970-01-01
      • 2013-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-20
      相关资源
      最近更新 更多