如何使用sed / awk或cut从html源中提取URL?

时间:2013-06-15 21:40:07

标签: sed awk

我正在编写一个脚本,它将html页面源作为文件下载,然后读取该文件并提取位于特定代码之后的特定URL。 (它只有1次出现)

以下是我需要匹配的示例:

<img id="sample-image" class="photo" src="http://xxxx.com/some/ic/pic_1asda963_16x9.jpg"

URL之前的代码将始终相同,因此我需要在以下之间提取部分:

<img id="sample-image" class="photo" src="
URL后面的

"

我尝试了像这样的sed:

sed -n '\<img\ id=\"sample-image\"\ class=\"photo\"\ src=\",\"/p' test.txt

但它不起作用。非常感谢您的建议,非常感谢!

4 个答案:

答案 0 :(得分:3)

您可以像这样使用

grep -oP '<img\s+id="sample-image"\s+class="photo"\s+src="\K[^"]+' test.txt

sed -r 's/<img\s+id="sample-image"\s+class="photo"\s+src="([^"]+)"/\1/' test.txt

awk -F'src="' -F'"' '/<img\s+id="sample-image"/{print $6}' test.txt

答案 1 :(得分:3)

如果您有GNU grep,那么您可以执行以下操作:

grep -oP "(?<=src=\")[^\"]+(?=\")" test.txt

如果您希望使用awk,则以下内容可行:

awk -F\" '{print $(NF-1)}' test.txt

答案 2 :(得分:1)

使用sed作为

echo $string | sed 's/\<img.*src="\(.*\)".*/\1/'

答案 3 :(得分:1)

您正在使用的sed命令的一些内容:

sed -n '\<img\ id=\"sample-image\"\ class=\"photo\"\ src=\",\"/p' test.txt
  • 您无需转义<"或空格。单引号可以防止shell在sed表达式上进行分词和其他内容。

  • 你基本上是这样做sed -n '/pattern/p' test.txt(除了你好像缺少开头反斜杠),说“匹配这个模式,然后打印包含匹配的行”,你实际上并没有提取URL。

  • 这是次要的,但您不需要匹配class="photo",因为id已经使HTML元素唯一(在同一HTML中没有两个元素共享相同的ID) )。

这就是我要做的事情

sed -n 's/.*<img id="sample-image".*src="\([^"]+\)".*/\1/p' test.txt
  • p标志告诉sed打印执行替换(s)的行。

  • \(pattern\)捕获一个子表达式,可以通过\1

    \2,s///等进行访问>
  • 正则表达式开头的.*以防在行上<img>元素之前还有其他内容(您确实提到要解析HTML文件)