找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 24188|回复: 10

[问题求助] sed 当一行有多个关键词时如何提取第一组关键词中间的内容

[复制链接]
发表于 2011-6-2 11:20:09 | 显示全部楼层 |阅读模式
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>字符串,它前面的字符串也显示了出来.
该如何作呢?
发表于 2011-6-2 12:32:26 | 显示全部楼层
这样就是取到最后一组数据(头痛。。。):
  1. sed "s/.*<span class=b>\(.*\)<\/span>.*/\1/"
复制代码
发表于 2011-6-2 12:42:46 | 显示全部楼层
只好用不保险的办法(字符串中不能有@字符):
  1. sed -e "s/<\/span>/@/" -e "s/.*<span class=b>\(.*\)@.*/\1/"
复制代码
发表于 2011-6-2 12:53:15 | 显示全部楼层
  1. sed -r "s#[^/]*<span class=b>(.*</a>).*#\1#" 1.txt
复制代码

评分

参与人数 1技术 +1 收起 理由
batman + 1 牛了!

查看全部评分

发表于 2011-6-2 12:56:36 | 显示全部楼层
试了下把关键字符串替换为引号(\x22)也可以:
  1. sed -e "s/<\/span>/\x22/" -e "s/.*<span class=b>\(.*\)\x22.*/\1/"
复制代码
发表于 2011-6-2 12:58:49 | 显示全部楼层
4# Batcher
batcher讲一下这个-r吧。。。
发表于 2011-6-2 13:01:45 | 显示全部楼层
  -r, --regexp-extended
                 use extended regular expressions in the script.


-r是启用扩展正则,使用s/xxx\(xxx\)xxx/\1/这样的后向引用时,圆括号前面的\就可以省去了。
发表于 2011-6-2 13:15:36 | 显示全部楼层
4# Batcher
中间有</a>啊。。。还是不通用

因为</a>是要得取的元素中可能有也可能无的元素。。。
 楼主| 发表于 2011-6-2 13:16:23 | 显示全部楼层
本想通过举例来举一反三,发现还是不行
4楼batcher的代码通过关键字前面没有的字符/,能解决顶楼问题,
但是若<span class=b>前面含有 / 则又不行了,并且</a>也是唯一性。

现在想知道的是 sed 能不能做到,只通过已知的关键字提取他们之间的内容.
还是一顶楼为例,即不能通过不确定的条件查找,
比如 <span class=b> 前面没有 /  
或需提取的内容结尾是</a>
 楼主| 发表于 2011-6-2 13:29:10 | 显示全部楼层
5楼 batman 的代码也类似,利用了需提取字符串后面没有引号的特点,若最后加个引号则又是提取到最后的了。
发表于 2011-8-24 23:54:57 | 显示全部楼层
我来试试看.我并不单纯地使用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'
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 03:36 , Processed in 0.021168 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表