使用sed或grep从具有特定id的html标签之间提取文本

时间:2012-10-30 18:50:43

标签: html linux sed grep

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

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

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

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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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之前,它将起作用。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

awk,sed和grep是面向行的工具。 XML和HTML基于标签。虽然你可以通过使用XML或HTML上的漂亮格式化程序来使用awk,sed和grep来处理XML或HTML,但这两者并没有很好地结合起来。

有一个名为xmlgawk的程序应该是非常类似于gawk的,同时还在使用XML。

我个人更喜欢使用lxml模块在Python中执行此类操作,以便可以完全理解XML / HTML而不会过于冗长。