使用 awk/grep 从 div 中提取内容

Extract content from div with awk/grep

假设以下 html 代码。

<div class='requirement'>
<div class='req-title'>
The quick brown fox jumps over the lazy dog
</div>
</div>

我想使用 awksed 等工具提取 The quick brown fox jumps over the lazy dog,我很确定它可以完成。

我知道 html 解析器是这项工作的正确工具,但这是我唯一一次处理 html 内容。

假设有换行符(HTML不需要)即file.txt内容为

<div class='requirement'>
<div class='req-title'>
The quick brown fox jumps over the lazy dog
</div>
</div>

您可以按照以下方式使用 GNU AWK 完成此任务

awk '/<div class=\x27req-title\x27>/{p=1;next}/<\x2fdiv>/{p=0}p{print}' file.txt

给出输出

The quick brown fox jumps over the lazy dog

说明:如果遇到<div class='req-title'>设置p1并转到下一行,如果遇到</div>设置p0。如果p print 当前行。请注意,我对具有特殊含义的字符使用了十六进制。 警告 这个解决方案很脆弱,即使是很小的改变也可能会失败,例如,如果使用 " 而不是 ',则会向 [= 添加另一个属性26=] 标签 &c.

(在 gawk 4.2.1 中测试)

I know html parser is the right tools for this job, but this is the only time I'll be dealing with html content.

如果允许安装工具,请考虑使用hxselect,它允许提取匹配CSS选择器的标签或其内容,在这种情况下它会像

cat file.txt | hxselect -i -c div.req-title

-i表示不区分大小写(HTML不区分大小写),-c表示仅包含内容(不包括开始和结束标记)div.req-titleCSS selector 意思是 div 其中有 class req-title。这应该比 GNU AWK 解决方案更健壮。

假设您要打印的部分是一行:

$ awk 'f{print; exit} [=10=]=="<div class=7req-title7>"{f=1}' file
The quick brown fox jumps over the lazy dog

否则:

$ awk 'f{if ([=11=]=="</div>") exit; print} [=11=]=="<div class=7req-title7>"{f=1}' file
The quick brown fox jumps over the lazy dog