使用grep从文件中提取值

时间:2015-06-10 06:42:49

标签: perl grep

我的文件包含以下内容:

<rdf:RDF
    xmlns:rdf="/www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:foaf="/xmlns.com/foaf/0.1/"
    xmlns:jfs="//abc.net/xmlns/prod/xyz/jfs/1.0/">
  <rdf:Description rdf:about="//alm.com/abc/users/piku">
    <foaf:mbox rdf:resource="mailto:piku@disney.com"/>
    <foaf:nick>piku</foaf:nick>
    <foaf:name>Pallavi Mishra</foaf:name>
    <jfs:archived rdf:datatype="//www.w3.org/2001/XMLSchema#boolean"
    >false</jfs:archived>
    <rdf:type rdf:resource="//xmlns.com/foaf/0.1/Person"/>
  </rdf:Description>
</rdf:RDF>

我可以使用perlgrep从此文件中提取电子邮件ID“piku@disney.com”并命名为“Pallavi Mishra”。

我的代码是:

my $Name = `cat abc.json | perl -l -ne '/<j.0:name>(.*)<\\/j.0:name>/ and print \$1'`;
my $EmailAddress = `cat abc.json | grep mailto | awk 'BEGIN{FS="\\"|:"} {for(i=1;i<NF;i++) if(\$i ~ /@/) print \$i}'`;

3 个答案:

答案 0 :(得分:3)

您应该使用适当的XML解析器,例如XML::LibXML

这个简短的程序展示了这个想法

use strict;
use warnings;
use 5.014;  # For non-destructive substitution

use XML::LibXML;

my $doc = XML::LibXML->load_xml(IO => \*DATA);

my $desc = $doc->find('/rdf:RDF/rdf:Description')->get_node(1);
my $mbox = $desc->find('foaf:mbox/@rdf:resource')->string_value  =~ s/^mailto://ir;
my $name = $desc->find('foaf:name')->string_value;
print qq{"$name" <$mbox>\n};

__DATA__
<rdf:RDF
    xmlns:rdf="/www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:foaf="/xmlns.com/foaf/0.1/"
    xmlns:jfs="//abc.net/xmlns/prod/xyz/jfs/1.0/">
  <rdf:Description rdf:about="//alm.com/abc/users/piku">
    <foaf:mbox rdf:resource="mailto:piku@disney.com"/>
    <foaf:nick>piku</foaf:nick>
    <foaf:name>Pallavi Mishra</foaf:name>
    <jfs:archived rdf:datatype="//www.w3.org/2001/XMLSchema#boolean"
    >false</jfs:archived>
    <rdf:type rdf:resource="//xmlns.com/foaf/0.1/Person"/>
  </rdf:Description>
</rdf:RDF>

<强>输出

"Pallavi Mishra" <piku@disney.com>

答案 1 :(得分:1)

尝试使用您自己的Perl字符串处理来解析XML。这是一个讨厌的不可靠的黑客。

Perl是一种功能强大的语言。您不需要使用shell来帮助Perl解析XML。

use XML::LibXML;
my $foaf = '/xmlns.com/foaf/0.1/';
my $rdf = '/www.w3.org/1999/02/22-rdf-syntax-ns#';

my $doc = XML::LibXML->new->load_xml(location => 'foof.xml');
my $Name = $doc->getElementsByTagNameNS($foaf, 'name')->[0]->textContent;
my $EmailAddress = $doc->getElementsByTagNameNS($foaf, 'mbox')->[0]->getAttributeNS($rdf, 'resource');
$EmailAddress =~ s/^mailto://;

答案 2 :(得分:1)

使用xmlstarlet

名称:

xmlstarlet sel -t -v /rdf:RDF/rdf:Description/foaf:name file

对于电子邮件地址:

xmlstarlet sel -t -v "/rdf:RDF/rdf:Description/foaf:mbox/@rdf:resource" file

您可以在第二个语句中添加sed语句以删除mailto部分:

xmlstarlet ... | sed 's/^mailto://g'