2013-05-07 100 views
0

我有具有以下结构,其中包含了许多<Episodes></Episodes>一个XML文件,其结构是这样的:使用bash脚本处理XML文件

<Episode> 
    <id>4195462</id> 
    <Combined_episodenumber>8</Combined_episodenumber> 
    <Combined_season>2</Combined_season> 
    <DVD_chapter></DVD_chapter> 
    <DVD_discid></DVD_discid> 
    <DVD_episodenumber></DVD_episodenumber> 
    <DVD_season></DVD_season> 
    <Director>Jay Karas</Director> 
    <EpImgFlag>2</EpImgFlag> 
    <EpisodeName>Karl's Wedding</EpisodeName> 
    <EpisodeNumber>8</EpisodeNumber> 
    <FirstAired>2011-11-08</FirstAired> 
    <GuestStars>Katee Sackhoff|Carla Gallo</GuestStars> 
    <IMDB_ID></IMDB_ID> 
    <Language>en</Language> 
    <Overview>Karl Hevacheck, aka the Human Genius, gets married.</Overview> 
    <ProductionCode>209</ProductionCode> 
    <Rating>7.6</Rating> 
    <RatingCount>20</RatingCount> 
    <SeasonNumber>2</SeasonNumber> 
    <Writer>Kevin Etten</Writer> 
    <absolute_number></absolute_number> 
    <filename>episodes/211751/4195462.jpg</filename> 
    <lastupdated>1362547148</lastupdated> 
    <seasonid>471254</seasonid> 
    <seriesid>211751</seriesid> 
</Episode> 

我已经找到了如何拉之间的信息单标签像这样

value=$(grep -m 1 "<Rating>" path_to_file | sed 's/<.*>\(.*\)<\/.*>/\1/') 

但我无法找到一种方法来验证我正在查看正确的情节,即。在保存特定属性的值之前检查这是否是<Combined_season>2</Combined_season> <EpisodeNumber>8</EpisodeNumber>的正确分支。我知道这可以以某种方式完成使用sed和awk的组合,但似乎无法弄清楚如何我可以做到这一点将不胜感激。

+3

使用合适的XML解析器而不是'sed'或'awk'! – 2013-05-07 10:18:04

+0

@sudo_O这个函数是一个更大的bash程序的一部分,所以我希望我可以使用其中的一个...为什么这是一个这么糟糕的主意? – brendosthoughts 2013-05-07 10:19:57

+1

您仍然可以从您的bash脚本中调用您的XML解析器。这是一个坏主意,因为XML是一个结构化文件,sed和awk是面向行文件的典型工作。你只会使用错误的工具让自己头痛。 – 2013-05-07 10:24:37

回答

1

使用合适的XML解析器不是sedawk。您仍然可以像使用sedawk那样从您的bash脚本调用XML解析器。使用sedawk是一个坏主意,因为XML是一个结构化文件,sedawk典型的面向行的文件。你只会使用错误的工具让自己头痛。我建议使用专用的工具或语言,如phppythonperl(或任何其他不以p开头的语言)具有用于解析XML的库。