Grep链接和链接名称以创建CSV文件

时间:2014-02-09 14:12:04

标签: regex bash sed awk grep

我正在尝试从文件中创建网址和名称列表。链接显示如下:

<table class="list">
  <tr><th valign="top">I</th><td><a href="main.asp">link45.php</a>, <a href="link.html">link</a>, <a href="link8.asp">link8</a>, <a href="link2.html">link 2</a></td></tr>

<tr><th valign="top">I</th><td><a href="main.asp">link45.php</a>, <a href="link.html">link</a>, <a href="link8.asp">link8</a>, <a href="link2.html">link 2</a></td></tr>
</table>

(也可能有一些tr和table标签。请忽略标签开头的空格。

我需要输出格式为csv,但我不确定如何使用grep执行此操作:

“linktoblah.html”,“链接名称”

我有一个工作的grep,它会删除所有的links.html,但不知道我会如何提取它旁边的名字。

cat list.html | grep -o '<a .*href=.*>' | sed -e 's/<a /\n<a /g' | sed -e 's/<a .*href=['"'"'"]//' -e 's/["'"'"'].*$//' -e '/^$/ d'

由于

3 个答案:

答案 0 :(得分:1)

您展示的线条可以用

提取
sed -e 's/.*=\(".*"\)>\(.*\)<.*$/\1, "\2"/'

示例:

echo '< a href="linktoblah.html">name of link < /a>.' | sed -a 's/.*=\(".*"\)>\(.*\)<.*$/\1, "\2"/'

产生

"linktoblah.html", "name of link "

根据文件中的其他内容,您可以使用grep中的选择器替换sed命令,如下所示:

sed -n -e '/href=/ s/.*=\(".*"\)>\(.*\)<.*$/\1, "\2"/p'

其中

/href=/

可以是任何只匹配所需行的正则表达式。字符串末尾的p表示“并打印”,-n标志表示“除非匹配,否则不做任何事情”。两者的组合使得单独grep不必要。

答案 1 :(得分:1)

我在使用PERL HTML :: TableExtract的不同帖子上找到了一种方法。

Get contents between table tags in everyfile in directory output to one file

非常感谢choroba的投入。

答案 2 :(得分:0)

新的awk
不确定这是否是您正在寻找的,但这是我从新数据中获得的:

awk -F"[\"<>]" -v RS="href=\"" 'NR>1 {print  "\""$1"\",\""$3"\""}' file
"main.asp","link45.php"
"link.html","link"
"link8.asp","link8"
"link2.html","link 2"
"main.asp","link45.php"
"link.html","link"
"link8.asp","link8"
"link2.html","link 2"