我想从 Mac OS X 命令行中将http://www.amiriconstruction.co.uk/goodwoodgolf/scoretable.htm中的文本提取到没有 html 标签的纯文本纺织品中。
我尝试了很多 sed 命令,但 sed 只会再次打印整个文件。我究竟做错了什么?
我试过的例子
sed -n '/<tr>/,/<\/tr>/p' scoretable.htm
(只会打印带有 html 标签的表格内容:()
我想从 Mac OS X 命令行中将http://www.amiriconstruction.co.uk/goodwoodgolf/scoretable.htm中的文本提取到没有 html 标签的纯文本纺织品中。
我尝试了很多 sed 命令,但 sed 只会再次打印整个文件。我究竟做错了什么?
我试过的例子
sed -n '/<tr>/,/<\/tr>/p' scoretable.htm
(只会打印带有 html 标签的表格内容:()
一个小小的 TXR 网页抓取,在wget
抓取页面的帮助下:
@(deffilter nobr ("<br />" ""))
@(deffilter brsp ("<br />" " "))
@(deffilter nosp (" " ""))
@(next "!wget 2>/dev/null -O - http://www.amiriconstruction.co.uk/goodwoodgolf/scoretable.htm")
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
@(skip)
<div class="scoreTableArea">
@(collect)
<h2 class="unify">@year - @event</h2>
@ (filter brsp event)
@ (collect)
<tr>
<td class="center">@pos</td>
<td>@player</td>
<td>@company</td>
<td>@date</td>
<td class="center">@points</td>
</tr>
@ (filter nobr player company date points)
@ (filter nosp pos points)
@ (until)
</tbody>
@ (end)
@(end)
@(output :filter :from_html)
@ (repeat)
Event: @event
Year: @year
DATE POS PT PLAYER COMPANY
@ (repeat)
@{date -10} @{pos -2} @{points 2} @{player 16} @company
@ (end)
@ (end)
@(end)
样品运行:
$ txr scoretable.txr
Event: Teeing off to Clobber Ken
Year: 2011
DATE POS PT PLAYER COMPANY
Sept 2011 1 40 John Durrant King Sumners Partnership
Sept 2011 2 34 Grahame Pettit Amiri Construction
Oct 2011 3 31 Tony Deacon Gleeds
Oct 2011 4 29 Tony Boyle Lacey Hickey Caley
Oct 2011 5 29 Richard Hemming Scott White and Hookins
Sept 2011 6 29 Ian McCoy Selway Joyce
June 2011 7 27 Julian Larkin C&G Properties
Sept 2011 8 25 Roque Menezes Capita Symonds
June 2011 9 22 Shawn Lambert PWP Architects
Sept 2011 10 22 Kevin Lendon Amiri Construction
Event: Ken Watson (HNW Architects) Undisputed Amiri Golf Demon of the Downs
Year: 2010
DATE POS PT PLAYER COMPANY
2010 1 40 Ken Watson HNW Architects
2010 2 37 David Heda London Clancy
2010 3 34 Gordon Brown Currie & Brown
2010 4 32 Alistair Taylor Wildbrook Properties
5 30 Andy Goodridge City Estates
6 25 Russ Pitman Henderson Green
7 24 Phil Piper Piper Whitlock
8 23 Kevin Miller Urban Pulse Architects
9 19 Simon Asquith Godsall Arnold Partnership
10 19 Shawn Lambert PWP Architects
11 18 Martin Judd Davis Langdon
sed -n 's;</\?td>;;gp' scoretable.html | \
sed -e 's;<td class="center">;;' \
-e 's;<.*>;;'
请注意,我使用;
而不是/
作为分隔符 - 我发现它更容易阅读。Sed 将使用您放在后面's
的任何字符作为分隔符。
好,现在解释。第一行:
-n
将抑制输出,但p
命令末尾的 sed 告诉 sed 专门打印与模式匹配的所有行。这只会让我们得到包裹在<td>
标签中的行。与此同时,我正在寻找任何匹配的东西</\?td>
并用任何东西代替它。/\?
意味着/
不能出现或只出现一次,所以这将匹配开始和结束标签。最后g
,或全局,意味着它在一行中第一次成功后不会停止尝试匹配模式。没有g
它只会替换开始标签。
此输出在第二行再次通过管道传输到 sed:
-e
只是指定有一个编辑命令要运行。如果您只运行一个命令,这是隐含的,但在这里我运行两个(下一个在第三行)。
这将删除<td class="center">
,并且下一行将删除任何其他标签(在本例中为<br>
tags.
仅当您确定一行上最多只有一个标签时,才能运行最后一个命令。否则.*
会贪心和匹配太多,所以在:
<td class="center">24 </ br>
它将匹配整行,并删除所有内容。