如何在两个字符串之间获取字符串

时间:2015-01-29 12:00:15

标签: bash perl shell

我有一组html文件,我必须在<hr></hr>标签之间提取内容。除了这个提取,我已经完成了所有工作。我做的是

1.加载所有html文件并将其存储在@html_files

2.然后我将每个文件的内容存储在@useful_files数组中。

3.然后我循环@useful_files数组并检查找到<hr>的每一行。如果发现我需要@elements数组中的下一行内容。

有可能。我在右边吗?

 foreach(@html_files){
 $single_file = $_;
 $elemets = ();
 open $fh, '<', $dir.'/'.$single_file or die "Could not open '$single_file' $!\n";
@useful_files = ();
@useful_files = <$fh>;
foreach(@useful_files){
    $line = $_;
    chomp($line);
    if($line =~ /<hr>/){
        @elements = $line;
    }
}
create(@elements,$single_file)
}

谢谢!!!

我的输入html文件将是这样的

<HR  SIZE="3" style="COLOR:#999999" WIDTH="100%" ALIGN="CENTER">
<P STYLE="margin-top:0px;margin-bottom:0px; text-indent:4%"><FONT STYLE="font-family:Times New Roman" SIZE="2">Lorem ipsum dolor sit amet, consectetur adipiscing elit.  </FONT></P> 
<P STYLE="font-size:12px;margin-top:0px;margin-bottom:0px">&nbsp;</P>
<TABLE CELLSPACING="0" CELLPADDING="0" WIDTH="100%" BORDER="0"  STYLE="BORDER-COLLAPSE:COLLAPSE">
<TR>
<TD WIDTH="45%"></TD>
<TD VALIGN="bottom" WIDTH="1%"></TD>
<TD WIDTH="4%"></TD>
<TD VALIGN="bottom"></TD>
<TD WIDTH="4%"></TD>
<TD VALIGN="bottom" WIDTH="1%"></TD>
<TD WIDTH="44%"></TD></TR>
<TR>
<TD VALIGN="top"></TD>
<TD VALIGN="bottom"><FONT SIZE="1">&nbsp;</FONT></TD>
<TD VALIGN="bottom"></TD>
<TD VALIGN="bottom"><FONT SIZE="1">&nbsp;</FONT></TD>
<TD VALIGN="bottom"><FONT STYLE="font-family:Times New Roman" SIZE="2">Title:</FONT></TD>
<TD VALIGN="bottom"><FONT SIZE="1">&nbsp;</FONT></TD>
<TD VALIGN="bottom"><FONT STYLE="font-family:Times New Roman" SIZE="2">John</FONT></TD></TR>
</TABLE>

<p Style='page-break-before:always'>
<HR  SIZE="3" style="COLOR:#999999" WIDTH="100%" ALIGN="CENTER">

我在这里复制的html代码只是样本。我需要<hr>数组中@elements之间的确切内容。

3 个答案:

答案 0 :(得分:1)

最简单的方法是:

my @cont;
foreach (@ARGV) {
  open my $fh,'<',$_;
  push @cont,join('',map { chomp; $_ } <$fh>)=~m%<hr>(.*?)</hr>%g;
}
#print join("\n",@cont,'');

是的,不要担心:所有文件将在退出时自动关闭&#34;自动&#34; :)

提示:取消注释print语句以查看结果。

答案 1 :(得分:1)

您可以在命令行中使用grep:

grep -Pzo '<hr>\K((.|\n)*)(?=</hr>)' file.html

即使有新的行,也可以在<hr></hr>之间提取任何内容。

示例:

tiago@dell:/tmp$ grep -Pzo '<hr>\K((.|\n)*)(?=</hr>)' <<< '<hr>a b c d </hr>'
a b c d 
tiago@dell:/tmp$ grep -Pzo '<hr>\K((.|\n)*)(?=</hr>)' <<< $'<hr>a b\nc d </hr>'
a b
c d

当然,你可以对多个文件运行grep。

答案 2 :(得分:0)

我知道有人说不用正则表达式来解析HTML,但这似乎是一种相对简单的任务,可以保证使用正则表达式。

试试这个:

if ($line =~ m/<hr>(.*?)<\/hr>/){
    push @elements, $1; 
}

这将在<hr></hr>之间提取文本,并将其存储在@elements数组的下一个索引中。

此外,您应始终在代码顶部use strict;use warnings;!这将阻止你犯下愚蠢的错误,并防止许多不必要的头痛。

在完成将其内容提取到@useful_files数组后,您还应关闭文件! close $fh;

(另一方面,这个数组的名称是误导性的。我建议你将它命名为@lines@file_contents,因为它包含单个文件的内容......不是多个文件作为您的变量名称似乎暗示。)