我正在尝试编写一个Perl脚本,它将更改如下所示的代码行……
<li><em>01 – Chapters 1-4</em> – 00:14:36 <br />..。让它看起来像这样。
01 – 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 – Chapters 1-4</em> – 00:14:36 <br />
<li><em>02 – Chapters 5-8</em> – 00:10:52 <br />
<li><em>03 – Chapters 9-14</em> – 00:19:16 <br />
<li><em>04 – Chapters 15-18</em> – 00:13:30 <br />
<li><em>05 – Chapters 19-22</em> – 00:17:01 <br />
<li><em>06 – Chapters 23-25</em> – 00:16:44 <br />
<li><em>07 – Chapter 26</em> – 00:10:35 <br />
red@ubuntu:~/scripts$ ./test.pl当我运行脚本时,我得到了这个输出...
[<li><em>01 – Chapters 1-4</em> – 00:14:36 <br />]
[<li><em>02 – Chapters 5-8</em> – 00:10:52 <br />]
[<li><em>03 – Chapters 9-14</em> – 00:19:16 <br />]
[<li><em>04 – Chapters 15-18</em> – 00:13:30 <br />]
[<li><em>05 – Chapters 19-22</em> – 00:17:01 <br />]
[<li><em>06 – Chapters 23-25</em> – 00:16:44 <br />]
[<li><em>07 – Chapter 26</em> – 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 – Chapters 1-4</em> – 00:14:36 <br />
<li><em>02 – Chapters 5-8</em> – 00:10:52 <br />
<li><em>03 – Chapters 9-14</em> – 00:19:16 <br />
<li><em>04 – Chapters 15-18</em> – 00:13:30 <br />
<li><em>05 – Chapters 19-22</em> – 00:17:01 <br />
<li><em>06 – Chapters 23-25</em> – 00:16:44 <br />
<li><em>07 – Chapter 26</em> – 00:10:35 <br />..。但仍然没有达到我想要的输出,我得到了这个。
red@ubuntu:~/scripts$ ./test.pl
[<li>01 – Chapters 1-4 – 00:14:36 <br />]
[<li>02 – Chapters 5-8 – 00:10:52 <br />]
[<li>03 – Chapters 9-14 – 00:19:16 <br />]
[<li>04 – Chapters 15-18 – 00:13:30 <br />]
[<li>05 – Chapters 19-22 – 00:17:01 <br />]
[<li>06 – Chapters 23-25 – 00:16:44 <br />]
[<li>07 – Chapter 26 – 00:10:35 <br />]..。看起来<em>和</em>被删除了,但我只想要<em>和</em>之间的文本。
发布于 2013-06-08 10:51:17
您将只替换与更新版本中匹配的那部分行。
print "[$1]\n" if /<em>(.*)<\/em>/;将只提供(.*)捕获组捕获的内容。这样你就不需要费心去做替换了。
但一定要注意安迪·莱斯特在评论中的谨慎。这可以很好地处理您的测试数据,但是HTML会破坏您的regexp而臭名昭著,特别是当您说出神奇的短语“但我真正的HTML数据将始终以这种形式出现”时。
发布于 2013-06-08 10:51:38
您正在使用与(和)匹配的\(.*\)。使用(.*)提取匹配项。
http://ideone.com/UTFDZo
根据您的update...you需要使用以下内容
$line =~ s/<em>(.*)<\/em>(.*)/$1/g;
http://ideone.com/AkJtIo
我强烈建议你考虑加入@AndyLester的评论。
发布于 2013-06-08 10:35:10
如果您想要捕获,您需要
(...)转义的括号尝试匹配括号。
https://stackoverflow.com/questions/16995416
复制相似问题