我有一系列的HTML文件,格式如下:
cinema name
film 1
showtime 1
showtime 2
...
film 2
showtime 1
showtime 2
showtime 3
...电影院的名称只在顶部列出一个;然后是电影列表(从1到n,可以是任意数量的电影),然后是放映时间列表(同样,它可以是一天中的1个或更多)。
我想使用grep提取此信息,并输出如下内容:
cinema name - film 1 - showtime 1
cinema name - film 1 - showtime 2
cinema name - film 2 - showtime 1
cineme name - film 2 - showtime 2
cinema name - film 2 - showtime 3
etc.但是,我不确定是否/如何使用grep来实现这一点。有可能吗?如果是这样的话,是怎么做的?
发布于 2012-04-24 00:18:13
您不必使用单个正则表达式来解决所有问题。在这种情况下,我只需找出我在前导空格处的哪一行,记住电影和电影的值是什么,然后在我遇到放映时间时将它们全部打印出来。尽管这个解决方案是用Perl实现的,但是您也可以用您选择的任何语言做同样的事情:
#!perl
use v5.10;
my( $cinema, $film );
while( <DATA> ) {
chomp;
if( /\A\S/ ) { $cinema = $_ }
elsif( /\A\s(\S.*)/ ) { $film = $1 }
elsif( /\A\s\s(\S.*)/ ) { say "$cinema - $film - $1" }
}
__END__
Regal 9
Jaws
15:00
19:00
21:00
Star Wars
16:00
17:00
18:00
AMC 18
E.T.
12:00
14:00
Black Sheep
22:00
01:00
03:00下面是一个丑陋的Perl单行版本:
perl -lne '(/\A\S/ and $c=$_) || (/\A\s(\S.*)/ and $f=$1) || (/\A\s\s(\S.*)/ and print"$c - $f - $1")' movies.txt发布于 2012-04-22 00:20:33
单个表达式是不可能的,但您可以在五个表达式中完成:
删除空行(简化一些内容):Find:"\n\n“Replace:"\n”
填写以下影片:
(查找影片后的放映时间,其前缀为以前的任意次数。捕获该影片,然后将其添加到放映时间的开头。)
Find: "(?<=\n ([^ \n].+)(\n .*)*)\n "
Replace: "\n $1 - "影院座无虚席:
(在电影院之后查找以任意数量的先前放映时间或电影作为前缀的放映时间。捕获电影院,然后将其添加到放映时间的开头。)
Find: "(?<=(?:^|\n)([^ \n].+)(\n {1,2}.*)*)\n "
Replace: "\n $1 - "删除非放映时间行:
Find: "(?<=^|\n)(?! ).*\n"
Replace: ""调整放映时间:
Find: "\n "
Replace: "\n"所有这些都是未经测试的,并且假定使用\n行终止符的类似.NET的正则表达式语法。根据口味进行调整。
https://stackoverflow.com/questions/10260480
复制相似问题