2016-05-17 66 views
1

赛后以前的href我有一个不formmated的html文件,我需要得到HREF链接,这只是在比赛前...我的HTML文件看起来像:获取用grep,awk或者sed

<a href="url1.com">Bla Bla Bla [Test1]</a><a href="url2.com">Bla Bla Bla [Test2]</a><a href="url3.com">Bla Bla Bla [Test3]</a> 

所以现在我需要在[Test2]模式之前获得href内容,并且预期的回报是url2.com。

我不是一个sed或awk专家,我不认为这是可能的纯粹的grep命令。

我可以使用下面的命令知道我的部分是否存在于文件内部,但我不知道如何获得以前的href。

grep -o '\[S06E04\]' file.html 

我真的很感激任何帮助。

感谢

+0

通常,这不是一个好主意,以处理未行分隔的数据,如XML,这些工具需要以行分隔的数据。改为使用'xmlstarlet'之类的东西。 –

+0

@MichaelVehrs:这个html好像被缩小了... – Jahid

回答

0

这应该工作:

sed -n 's/.*href="\([^"]*\)">.*\[Test2\].*/\1/p' file 
url2.com 

随着GNU的grep:

grep -oP '(?<=href=")[^"]*(?=">[^<>]*\[Test2\])' file 
url2.com 
0
$ awk -F'[[\\]"]' '{for (i=1; i<=NF; ++i) {if ($i == "Test2") print $(i-2)}}' w.txt 

url2.com 
0

使用grep与PCRE(-P):

grep -Po 'href="\K[^"]+(?="[^[]+\[Test2\])' file.html 
  • href="匹配字面上所需URI之前,\K丢弃匹配

  • [^"]+得到期望部分

  • 零宽度正预测先行图案,(?="[^[]+\[Test2\]),确保了匹配之后是什么在方括号内但是[Test2]


使用 sed

类似的逻辑:

sed -E 's/.*[[:blank:]]href="([^"]+)"[^[]+\[Test2\].*/\1/' file.html 

实施例:

$ grep -Po 'href="\K[^"]+(?="[^[]+\[Test2\])' <<<'<a href="url1.com">Bla Bla Bla [Test1]</a><a href="url2.com">Bla Bla Bla [Test2]</a><a href="url3.com">Bla Bla Bla [Test3]</a>' 
url2.com 

$ sed -E 's/.*[[:blank:]]href="([^"]+)"[^[]+\[Test2\].*/\1/' <<<'<a href="url1.com">Bla Bla Bla [Test1]</a><a href="url2.com">Bla Bla Bla [Test2]</a><a href="url3.com">Bla Bla Bla [Test3]</a>' 
url2.com