1

このような行を変更する Perl スクリプトを作成しようとしています...

<li><em>01 &#8211; Chapters 1-4</em> &#8211; 00:14:36 <br />

...そして、このようにします...

01 &#8211; Chapters 1-4

…大したことないですよね?\(.*\)Perl スクリプトで次のように実行するだけです。

#!/usr/bin/perl -w
use strict;

while(<DATA>) {
        my $line = $_;
        chomp($line);
        if ( $line =~ /^<li>/ ) {
                $line =~ s/<em>\(.*\)<\/em>/$1/g;
                print "[" . $line . "]\n";
        }
}
__DATA__
<li><em>01 &#8211; Chapters 1-4</em> &#8211; 00:14:36 <br />
<li><em>02 &#8211; Chapters 5-8</em> &#8211; 00:10:52 <br />
<li><em>03 &#8211; Chapters 9-14</em> &#8211; 00:19:16 <br />
<li><em>04 &#8211; Chapters 15-18</em> &#8211; 00:13:30 <br />
<li><em>05 &#8211; Chapters 19-22</em> &#8211; 00:17:01 <br />
<li><em>06 &#8211; Chapters 23-25</em> &#8211; 00:16:44 <br />
<li><em>07 &#8211; Chapter 26</em> &#8211; 00:10:35 <br />
red@ubuntu:~/scripts$ ./test.pl

スクリプトを実行すると、この出力が得られます...

[<li><em>01 &#8211; Chapters 1-4</em> &#8211; 00:14:36 <br />]
[<li><em>02 &#8211; Chapters 5-8</em> &#8211; 00:10:52 <br />]
[<li><em>03 &#8211; Chapters 9-14</em> &#8211; 00:19:16 <br />]
[<li><em>04 &#8211; Chapters 15-18</em> &#8211; 00:13:30 <br />]
[<li><em>05 &#8211; Chapters 19-22</em> &#8211; 00:17:01 <br />]
[<li><em>06 &#8211; Chapters 23-25</em> &#8211; 00:16:44 <br />]
[<li><em>07 &#8211; Chapter 26</em> &#8211; 00:10:35 <br />]

...ここで何が間違っていますか?

ありがとう

アップデート:

返信ありがとうございます。彼らはとても役に立ちます。コードをこれに変更しました...

red@ubuntu:~/scripts$ cat test.pl
#!/usr/bin/perl -w
use strict;

while(<DATA>) {
        my $line = $_;
        chomp($line);
        if ( $line =~ /^<li>/ ) {
                $line =~ s/<em>(.*)<\/em>/$1/g;
                print "[" . $line . "]\n";
        }
}
__DATA__
<li><em>01 &#8211; Chapters 1-4</em> &#8211; 00:14:36 <br />
<li><em>02 &#8211; Chapters 5-8</em> &#8211; 00:10:52 <br />
<li><em>03 &#8211; Chapters 9-14</em> &#8211; 00:19:16 <br />
<li><em>04 &#8211; Chapters 15-18</em> &#8211; 00:13:30 <br />
<li><em>05 &#8211; Chapters 19-22</em> &#8211; 00:17:01 <br />
<li><em>06 &#8211; Chapters 23-25</em> &#8211; 00:16:44 <br />
<li><em>07 &#8211; Chapter 26</em> &#8211; 00:10:35 <br />

...しかし、それでも私が望む出力に到達しません 代わりにこれを取得します...

red@ubuntu:~/scripts$ ./test.pl
[<li>01 &#8211; Chapters 1-4 &#8211; 00:14:36 <br />]
[<li>02 &#8211; Chapters 5-8 &#8211; 00:10:52 <br />]
[<li>03 &#8211; Chapters 9-14 &#8211; 00:19:16 <br />]
[<li>04 &#8211; Chapters 15-18 &#8211; 00:13:30 <br />]
[<li>05 &#8211; Chapters 19-22 &#8211; 00:17:01 <br />]
[<li>06 &#8211; Chapters 23-25 &#8211; 00:16:44 <br />]
[<li>07 &#8211; Chapter 26 &#8211; 00:10:35 <br />]

<em>...とが削除されたように見えますが、と</em>の間のテキストが必要なだけです。<em></em>

4

5 に答える 5

6

更新されたバージョンで一致する行の部分のみを置き換えています。

print "[$1]\n" if /<em>(.*)<\/em>/;

(.*)捕獲グループが捕獲したものだけをあなたに与えます。そして、置換を気にする必要はありません。

ただし、コメントでの Andy Lester の警告に注意してください。これはテストデータでも問題なく機能しますが、HTML は正規表現を壊すことで有名です。特に、「しかし、実際の HTML データは常にこの形式になります」という魔法のフレーズを言う場合はそうです。

于 2013-06-08T02:51:16.550 に答える
3

\(.*\)に一致するものを使用しています。一致を抽出するために使用します。()(.*)

http://ideone.com/UTFDZo

更新に基づいて...次を使用する必要があります

$line =~ s/<em>(.*)<\/em>(.*)/$1/g;

http://ideone.com/AkJtIo

@AndyLester のコメントを取り入れることを検討することを強くお勧めします。

于 2013-06-08T02:51:37.677 に答える
2

<em>文字列の最初の部分からタグを削除するだけです。他のすべても削除したい場合は、これを書きます

use strict;
use warnings;

while(<DATA>) {
  print "[$1]\n" if /^<li><em>([^<>]+)/;
}

__DATA__
<li><em>01 &#8211; Chapters 1-4</em> &#8211; 00:14:36 <br />
<li><em>02 &#8211; Chapters 5-8</em> &#8211; 00:10:52 <br />
<li><em>03 &#8211; Chapters 9-14</em> &#8211; 00:19:16 <br />
<li><em>04 &#8211; Chapters 15-18</em> &#8211; 00:13:30 <br />
<li><em>05 &#8211; Chapters 19-22</em> &#8211; 00:17:01 <br />
<li><em>06 &#8211; Chapters 23-25</em> &#8211; 00:16:44 <br />
<li><em>07 &#8211; Chapter 26</em> &#8211; 00:10:35 <br />

出力

[01 &#8211; Chapters 1-4]
[02 &#8211; Chapters 5-8]
[03 &#8211; Chapters 9-14]
[04 &#8211; Chapters 15-18]
[05 &#8211; Chapters 19-22]
[06 &#8211; Chapters 23-25]
[07 &#8211; Chapter 26]
于 2013-06-08T12:44:46.567 に答える
2

キャプチャしたい場合は、

 (...)

エスケープされた括弧は、括弧と一致しようとします。

于 2013-06-08T02:35:09.813 に答える