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

xhv8bpkk  于 2023-01-01  发布在  Linux
关注(0)|答案(4)|浏览(195)

我应该使用什么命令从以下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更容易的话,我不反对使用grep。

ogq8wdun

ogq8wdun1#

您可以尝试使用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
r9f1avp5

r9f1avp52#

使用awk、sed或grep执行此操作很不方便,因为这些工具都是基于行的(一次一行)。是否可以保证您尝试提取的span都在同一行上?是否可以在span中使用其他标记(例如em标记)?如果不可以,那么这听起来像是perl的工作。

llmtgqce

llmtgqce3#

sed和grep是面向行的工具。XML和HTML是基于标记的。这两种工具不能很好地合并在一起,尽管您可以在使用面向行的工具之前,通过在XML或HTML上使用漂亮的格式化程序,在XML和HTML上使用awk、sed和grep。
有一个叫做xmlgawk的程序,它应该是非常像gawk的,同时仍然在处理XML。
我个人更喜欢在Python中使用lxml模块来完成这类工作,这样就可以完全理解XML/HTML而不会过于冗长。

stszievb

stszievb4#

使用grep -o

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

将发现:

#=>extractme
#=>extractmetoo

如果携带期望的id属性的span元素紧接在extractme填充物之前出现,则它将起作用。

相关问题