sed / grep - 获取两个字符串之间的文本(html)

时间:2014-08-10 20:44:01

标签: regex macos bash unix sed

我正在尝试从以下内容中提取“pagename”:

<a class="timetable work" href="http://www.test.com/pagename?tag=meta376">Test</a>

我尝试使用“sed”让它工作,但它只是说无效的命令代码。

你们建议使用哪一行代码来获取页面名称?顺便说一下:这不是一条线,但同一条线上有更多内容 - 但这不应该有所作为,因为它应该只关系限制器之间的内容,对吧?

先谢谢你帮助我!

5 个答案:

答案 0 :(得分:0)

正如您所评论的,如果要提取"<a class="timetable work" href="test.com/"; and "?tag=meta376">Test</a>",可以使用以下正则表达式:

<a class="timetable.*?<\/a>

<强> Working demo

如果你想抓住内容只围绕正则表达式捕获组:

(<a class="timetable.*?<\/a>)

比赛是:

MATCH 1
1.  [9-80]  `<a class="timetable work" href="test.com/"; and "?tag=meta376">Test</a>`

答案 1 :(得分:0)

我认为这就是你想要的:

sed 's_^.*<a [^<>]* href="https*://[^/]*/\([^"?]*\).*$_\1_'

答案 2 :(得分:0)

准确地告诉您要求使用的是您告诉我们使用的分隔符:

$ sed -n 's|.*<a class="timetable work" href="http://www\.test\.com/\(.*\)?tag=meta376">Test</a>|\1|p' file
pagename

答案 3 :(得分:0)

我知道使用正则表达式处理这个问题可能很诱人,但这里有另一种选择。

您正在尝试解析某些HTML,因此请使用HTML解析器。这是Perl中的一个例子:

use strict;
use warnings;
use feature qw(say);

use HTML::TokeParser::Simple;
use URI::URL;

my $filename = 'file.html'; 
my $parser = HTML::TokeParser::Simple->new($filename);

while (my $anchor = $parser->get_tag('a')) {
    next unless defined(my $class = $anchor->get_attr('class'));
    next unless $class =~ /\btimetable\b/ and $class =~ /\bwork\b/;    
    my $url = url $anchor->get_attr('href');    
    say substr($url->path, 1);
}

使用HTML::TokeParser::Simple解析HTML。循环遍历<a>标签,跳过任何没有定义正确类的标签。对于那些,使用URI::URL来解析网址并提取&#34;路径&#34;组件(在您的情况下,将是&#34; / pagename&#34;)。由于您不想要前导斜杠,我使用substr删除了第一个字符。

输出:

pagename

我知道它比单个正则表达式更长,但它也更强大,并且即使HTML的格式稍有变化也会继续有效未来。存在HTML解析器的原因是:)

答案 4 :(得分:0)

我会使用awk

awk -F"[/?]" '/timetable work/ {print $4}'file
pagename

搜索包含timetable work的行,然后使用\?作为分隔符打印第四个字段。