标题: [问题求助] sed 当一行有多个关键词时如何提取第一组关键词中间的内容 [打印本页]
作者: 随风 时间: 2011-6-2 11:20 标题: sed 当一行有多个关键词时如何提取第一组关键词中间的内容
sed 当一行有多个关键词时如何提取第一组关键词中间的内容
aaa '<span class=a><span class=b>ABC<ahref="//link.com">link</a></span>5678</span>gg<hth<span class=b>000<1>2<3></span>
上行中有多个<span class=b>和</span>
想要提取第一个<span class=b>和第一个</span>之间的字符串
即 ABC<a href="//link.com">link</a>
匹配第一个"号前的内容,可以用 [^\"] 如果把引号改为关键词呢
sed "s/[^<span class=b>]*<span class=b>\([^>]*>[^>]*>\).*/\1/" a.txt
pause
思路是 匹配非<span class=b>字符串,可以重复N次,到<span class=b>止
但结果只是删除了<span class=b>字符串,它前面的字符串也显示了出来.
该如何作呢?
作者: batman 时间: 2011-6-2 12:32
这样就是取到最后一组数据(头痛。。。):- sed "s/.*<span class=b>\(.*\)<\/span>.*/\1/"
复制代码
作者: batman 时间: 2011-6-2 12:42
只好用不保险的办法(字符串中不能有@字符):- sed -e "s/<\/span>/@/" -e "s/.*<span class=b>\(.*\)@.*/\1/"
复制代码
作者: Batcher 时间: 2011-6-2 12:53
- sed -r "s#[^/]*<span class=b>(.*</a>).*#\1#" 1.txt
复制代码
作者: batman 时间: 2011-6-2 12:56
试了下把关键字符串替换为引号(\x22)也可以:- sed -e "s/<\/span>/\x22/" -e "s/.*<span class=b>\(.*\)\x22.*/\1/"
复制代码
作者: batman 时间: 2011-6-2 12:58
4# Batcher
batcher讲一下这个-r吧。。。
作者: Batcher 时间: 2011-6-2 13:01
-r, --regexp-extended
use extended regular expressions in the script.
|
-r是启用扩展正则,使用s/xxx\(xxx\)xxx/\1/这样的后向引用时,圆括号前面的\就可以省去了。
作者: batman 时间: 2011-6-2 13:15
4# Batcher
中间有</a>啊。。。还是不通用
因为</a>是要得取的元素中可能有也可能无的元素。。。
作者: 随风 时间: 2011-6-2 13:16
本想通过举例来举一反三,发现还是不行
4楼batcher的代码通过关键字前面没有的字符/,能解决顶楼问题,
但是若<span class=b>前面含有 / 则又不行了,并且</a>也是唯一性。
现在想知道的是 sed 能不能做到,只通过已知的关键字提取他们之间的内容.
还是一顶楼为例,即不能通过不确定的条件查找,
比如 <span class=b> 前面没有 /
或需提取的内容结尾是</a>
作者: 随风 时间: 2011-6-2 13:29
5楼 batman 的代码也类似,利用了需提取字符串后面没有引号的特点,若最后加个引号则又是提取到最后的了。
作者: nooope 时间: 2011-8-24 23:54
我来试试看.我并不单纯地使用sed
cat aaa.dat
<span class=a><span class=b>ABC<ahref="//link.com">link</a></span>5678</span>gg<hth<span class=b>000<1>2<3></span>
- grep -oP '<span class=b>.*' aaa.dat | sed 's/<\/span>.*//g'
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |