我需要搜索一个包含数百或数千个文件的目录,每个文件包含带有一个或多个特定字符串实例的XML(带数据的开始/结束标记)。 我可以通过
获取字符串的所有实例grep -ho '<mytagname>..............<\/mytagname>' /home/xyzzy/mydata/*.XML > /home/mydata/tagvalues.txt
然后一些sed命令剥离标签,所以我最终得到一个只包含值列表的文件:
value001
value002
value003
(等)
理想情况下,我希望文件的每一行都包含文件名,以便我可以导入数据库进行分析。
所以我的结果会是这样的
fileAAA value001
fileAAA value002
fileAAA value003
fileBBB value004
上述的精确格式很灵活 - 可以有空格或其他分隔符,它甚至可以包含开始/结束标记。
我能得到的最接近的是grep -o
fileAAA:value001
value002
value003
fileBBB:value004
perl单线程看起来很理想,但我已经足够新了,我不知道如何开始。
答案 0 :(得分:4)
可以使用像这样的单线程来完成:
perl -lne 'print "$ARGV $1" if /<mytagname>(.*?)<\/mytagname>/' *.xml
但是,我强烈建议您使用实际的XML解析器,例如XML::Twig
或XML::LibXML
use strict;
use warnings;
use XML::LibXML;
for my $file (</home/xyzzy/mydata/*.XML>) {
my $doc = XML::LibXML->load_xml(location => $file);
for my $node ($doc->findnodes("//mytagname")) {
print "$file " . $node->textContent() . "\n";
}
}
答案 1 :(得分:0)
awk怎么样?
awk -F'</?mytagname>' '$2 {print FILENAME,$2}' /home/xyzzy/mydata/*.XML
说明:
-F regex
- set field delimiter必须是一个单独的参数,因此用自己的引号括起来$2
- 如果第二个字段的值为{print FILENAME,$2}
- print filename SPACE第二个字段的值