2

我正在编写一个脚本,它将一个 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

4 回答 4

3

如果您有GNUgrep 那么您可以执行以下操作:

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

如果您想使用,awk那么以下方法将起作用:

awk -F\" '{print $(NF-1)}' test.txt
于 2013-06-15T22:17:12.223 回答
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
于 2013-06-15T21:43:00.897 回答
2

用 sed 作为

echo $string | sed 's/\<img.*src="\(.*\)".*/\1/'
于 2013-06-15T21:55:00.133 回答
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访问的子表达式\2s///

  • 正则表达式的.*开头是万一<img>在该行的元素之前还有其他内容(您确实提到您正在解析 HTML 文件)

于 2013-06-15T22:08:37.120 回答