我正在尝试从以下内容中提取“pagename”:
<a class="timetable work" href="http://www.test.com/pagename?tag=meta376">Test</a>
我尝试使用“sed”让它工作,但它只是说无效的命令代码。
你们建议使用哪一行代码来获取页面名称?顺便说一下:这不是一条线,但同一条线上有更多内容 - 但这不应该有所作为,因为它应该只关系限制器之间的内容,对吧?
先谢谢你帮助我!
答案 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
的行,然后使用\
或?
作为分隔符打印第四个字段。