1

次のようにフォーマットされた一連の HTML ファイルがあります。

cinema name
 film 1
  showtime 1
  showtime 2
  ...

 film 2
  showtime 1
  showtime 2
  showtime 3
  ...

映画館の名前は一番上に1つだけリストされています。次に、映画のリスト (ここには 1 から n までの任意の数の映画を含めることができます) があり、次に上映時間のリスト (ここでも、1 日の間に 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でこれを達成できるかどうか、またはどのように達成できるかはわかりません。出来ますか?もしそうなら、どのように?

4

2 に答える 2

1

単一の正規表現ですべての問題を解決する必要はありません。この場合、先頭の空白によってどのような行があるかを把握し、シネマと映画の値を覚えておき、上映時間になったらそれらをすべて一緒に出力します。このソリューションは 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-23T16:18:13.247 に答える
0

単一の式はできませんが、5 つの式で実行できます。

空白行を削除します (いくつかのものを簡素化します): 検索: "\n\n" 置換: "\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"

これらはすべてテストされておらず、.NET のような行末記号付きの正規表現構文を想定しています\n。味を調整します。

于 2012-04-21T16:20:32.830 に答える