Board logo

标题: [问题求助] 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

这样就是取到最后一组数据(头痛。。。):
  1. sed "s/.*<span class=b>\(.*\)<\/span>.*/\1/"
复制代码

作者: batman    时间: 2011-6-2 12:42

只好用不保险的办法(字符串中不能有@字符):
  1. sed -e "s/<\/span>/@/" -e "s/.*<span class=b>\(.*\)@.*/\1/"
复制代码

作者: Batcher    时间: 2011-6-2 12:53

  1. sed -r "s#[^/]*<span class=b>(.*</a>).*#\1#" 1.txt
复制代码

作者: batman    时间: 2011-6-2 12:56

试了下把关键字符串替换为引号(\x22)也可以:
  1. 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>
  1. grep -oP '<span class=b>.*' aaa.dat | sed  's/<\/span>.*//g'
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2