[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[问题求助] 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>字符串,它前面的字符串也显示了出来.
该如何作呢?
技术问题请到论坛发帖求助!

我来试试看.我并不单纯地使用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'
复制代码

TOP

5楼 batman 的代码也类似,利用了需提取字符串后面没有引号的特点,若最后加个引号则又是提取到最后的了。
技术问题请到论坛发帖求助!

TOP

本想通过举例来举一反三,发现还是不行
4楼batcher的代码通过关键字前面没有的字符/,能解决顶楼问题,
但是若<span class=b>前面含有 / 则又不行了,并且</a>也是唯一性。

现在想知道的是 sed 能不能做到,只通过已知的关键字提取他们之间的内容.
还是一顶楼为例,即不能通过不确定的条件查找,
比如 <span class=b> 前面没有 /  
或需提取的内容结尾是</a>
技术问题请到论坛发帖求助!

TOP

4# Batcher
中间有</a>啊。。。还是不通用

因为</a>是要得取的元素中可能有也可能无的元素。。。
***共同提高***

TOP

  -r, --regexp-extended
                 use extended regular expressions in the script.


-r是启用扩展正则,使用s/xxx\(xxx\)xxx/\1/这样的后向引用时,圆括号前面的\就可以省去了。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

4# Batcher
batcher讲一下这个-r吧。。。
***共同提高***

TOP

试了下把关键字符串替换为引号(\x22)也可以:
  1. sed -e "s/<\/span>/\x22/" -e "s/.*<span class=b>\(.*\)\x22.*/\1/"
复制代码
***共同提高***

TOP

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

评分人数

我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

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

TOP

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

TOP

返回列表