一个简单的、松散的、没有验证的、很容易被 HTML 中的变化所混淆的 HTML 处理的最小程序是:
sed.脚本
/ *<div class="item_title">\(.*\)<\/div>/ { s//\1/; h; }
/ *<div class="item_desc">/,/<\/div>/ {
/<div class="item_desc">/d
/<\/div>/d
s/^ *//
G
s/\(.*\)\n\(.*\)/\2;\1/p
}
第一行与项目标题行匹配。这s///
命令仅捕获之间的部分<div …>
and </div>
; the h
将其复制到保留空间(内存)中。
脚本的其余部分与项目描述之间的行相匹配<div>
和它的</div>
。前两行删除(忽略)<div>
and </div>
线。这s///
删除前导空格;这G
将保留空间附加到换行符之后的模式空间;这s///p
捕获换行符之前的部分(描述)和换行符之后的部分(保留空间中的标题),并将它们替换为标题和描述,并用分号分隔,然后打印结果。
Example
$ sed -n -f sed.script items.html
ITEM 1;ITEM DESCRIPTION 1
ITEM 2;ITEM DESCRIPTION 2
$
请注意-n
;这意味着“除非被告知否则不要打印”。
您可以在没有脚本文件的情况下完成此操作,但如果您使用脚本文件,则无需担心。如果你小心的话,你甚至可以将它们全部挤到一根线上。请注意;
之后h
对于 BSD 来说是必要的sed
对 GNU 来说无害但并不重要sed
.
修改
有各种各样的方法可以使它更加防弹(但它们是否值得争论)。例如:
/ *<div class="item_title">\(.*\)<\/div>/
可修改为:
/^[[:space:]]*<div class="item_title">[[:space:]]*\(.*\)[[:space:]]*<\/div>[[:space:]]*$/
处理之前、中间和之后的任意空白序列<div>
成分。对其他正则表达式重复令人恶心的事情。您可以安排单词之间有单个空格。您可以安排将多行描述作为单行打印一次,而不是像现在那样单独打印每个线段。
您还可以将整个构造包装在文件中:
/^<div class="result">$/,/^<\/div>$/ {
…script as before…
}
您可以重复这个想法,以便仅在内部选择项目标题<div class="item">
and </div>
, etc.