用sed 提取一对 html 标签之间的内容
作者:shen 发布时间:May 27, 2011 分类:Shell
比如有一段html代码如下:
<h3 class=a>ABCD</h3>abc<span>1234<span class=b>EF</span>5678</span>
想要提取ABCDEF ,可以使用sed的模式替换,即将向提取的内容保存到模式中
首先需要提取h3标签之间的内容,然后提取内层的span之间的内容。
代码如下:
echo "<h3 class=a>ABCD</h3>fdffd<span>1234<span class=b>EF</span>5678</span>"|\
sed 's/.*<h3 class=a>\(.*\)<\/h3>.*<span class=b>\([^\(<\/span>\)]*\)<\/span>.*/\1\2/'
#由于有两层span ,所以在<span class=b>和<\/span>之间不能有<\/span>,所以使用[^\(<\/span>>\)]*
对于嵌套的() ,模式顺序是先外层,后内层,例如:
echo "0123abc456defg" |sed 's/[0-9]*\([a-z]\{2\}\(.*\)[0-9]\)[a-z]*/\2 - \1/g'
sed的模式中圆括号和花括号都要加反斜杠 \ 转义。
显示c45 - abc456
外层括号匹配数字之后,字母之前,中间含有字母和数字的子字符串,在替换串中用 \1 表示,结果为abc456
内层括号匹配外层串abc456中两个字母之后,一个数字之前的子串,在替换串中用 \2 表示,结果为c45
这种方法错误,[^\(<\/span>\)]不能匹配非<\/span>