0

我应该使用什么命令从以下 html 代码中提取文本,该代码位于“test.html”文件中,其中包含:“ <span id="imAnID">extractme</span>”?

该文件会更大,所以我需要将 grep 或 sed 指向一个 id,然后告诉它只从具有此 ID 的标签中提取文本。假设我从文件所在的目录运行终端,我这样做:

cat test.html | sed -n 's/.*<span id="imAnID">\(.*\)<\/span>.*/\1/p'

我究竟做错了什么?我得到一个空输出......如果它更容易,不反对使用 grep 。

4

4 回答 4

0

为此使用 awk、sed 或 grep 很尴尬,因为这些工具是基于行的(一次一行)。是否保证您尝试提取的跨度都在同一行?是否有可能在跨度内使用其他标签(例如em标签)?如果不是,那么这听起来像是perl的工作。

于 2012-10-30T21:46:41.667 回答
0

awk、sed 和 grep 是面向行的工具。XML 和 HTML 基于标签。两者结合得并不好,尽管在使用面向行的工具之前,您可以通过在 XML 或 HTML 上使用漂亮的格式化程序在 XML 和 HTML 上使用 awk、sed 和 grep。

有一个名为 xmlgawk 的程序应该非常类似于 gawk,同时仍在处理 XML。

我个人更喜欢在 Python 中使用 lxml 模块来做这种事情,这样可以完全理解 XML/HTML,而不会太罗嗦。

于 2012-10-30T22:35:49.037 回答
0

您可以尝试这样做awk

  #!/bin/bash

  start_tag="span id=\"imAnID\""
  end_tag="/span"

  awk -F'[<>]' -v taga="$start_tag" -v tagb="$end_tag" '{ i=1; while (i<=NF) { if ($(i)==taga && $(i+2)==tagb) { print $(i+1) }; i++} }'

通过以下方式使用它:

$ ./script < infile > outfile
于 2012-10-30T19:09:19.133 回答
0

使用grep -o

echo "<span id="imAnID" hello>extractme</span> <span id='imAnID'>extractmetoo</span>" | grep -oE 'id=.?imAnID[^<>]*>[^<>]+' | cut -d'>' -f2

会发现:

#=>extractme
#=>extractmetoo

span如果带有所需id属性的元素紧接在extractme东西之前,它将起作用。

于 2012-10-30T21:43:26.837 回答