首页
学习
活动
专区
圈层
工具
发布

多级grep
EN

Stack Overflow用户
提问于 2012-04-21 23:46:35
回答 2查看 282关注 0票数 1

我有一系列的HTML文件,格式如下:

代码语言:javascript
复制
cinema name
 film 1
  showtime 1
  showtime 2
  ...

 film 2
  showtime 1
  showtime 2
  showtime 3
  ...

电影院的名称只在顶部列出一个;然后是电影列表(从1到n,可以是任意数量的电影),然后是放映时间列表(同样,它可以是一天中的1个或更多)。

我想使用grep提取此信息,并输出如下内容:

代码语言:javascript
复制
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来实现这一点。有可能吗?如果是这样的话,是怎么做的?

EN

回答 2

Stack Overflow用户

发布于 2012-04-24 00:18:13

您不必使用单个正则表达式来解决所有问题。在这种情况下,我只需找出我在前导空格处的哪一行,记住电影和电影的值是什么,然后在我遇到放映时间时将它们全部打印出来。尽管这个解决方案是用Perl实现的,但是您也可以用您选择的任何语言做同样的事情:

代码语言:javascript
复制
#!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单行版本:

代码语言:javascript
复制
perl -lne '(/\A\S/ and $c=$_) || (/\A\s(\S.*)/ and $f=$1) || (/\A\s\s(\S.*)/ and print"$c - $f - $1")' movies.txt
票数 1
EN

Stack Overflow用户

发布于 2012-04-22 00:20:33

单个表达式是不可能的,但您可以在五个表达式中完成:

删除空行(简化一些内容):Find:"\n\n“Replace:"\n”

填写以下影片:

(查找影片后的放映时间,其前缀为以前的任意次数。捕获该影片,然后将其添加到放映时间的开头。)

代码语言:javascript
复制
Find: "(?<=\n ([^ \n].+)(\n  .*)*)\n  "
Replace: "\n  $1 - "

影院座无虚席:

(在电影院之后查找以任意数量的先前放映时间或电影作为前缀的放映时间。捕获电影院,然后将其添加到放映时间的开头。)

代码语言:javascript
复制
Find: "(?<=(?:^|\n)([^ \n].+)(\n {1,2}.*)*)\n  "
Replace: "\n  $1 - "

删除非放映时间行:

代码语言:javascript
复制
Find: "(?<=^|\n)(?!  ).*\n"
Replace: ""

调整放映时间:

代码语言:javascript
复制
Find: "\n  "
Replace: "\n"

所有这些都是未经测试的,并且假定使用\n行终止符的类似.NET的正则表达式语法。根据口味进行调整。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10260480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档