免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 11474 | 回复: 16
打印 上一主题 下一主题

[文本处理] sed 命令达到 grep -o 的作用 [复制链接]

论坛徽章:
1
白羊座
日期:2013-12-29 17:58:28
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-01-23 11:46 |只看该作者 |倒序浏览
本帖最后由 newoz 于 2014-01-23 12:24 编辑

也就是说,我想用sed命令实现 ”grep -o“  (only match) 的效果。

因为一行里有好几个匹配的需要输出。 比如:
  1. afoe=test1 afoo=test2 afoo=test3 afoe=test4 afoo=test5
复制代码
我只想要 afoo=后面的内容。

  1. test2
  2. test3
  3. test5
复制代码
如果可以的话,因为该行有可能被分割(我也不确定会在哪里被换行了),我有该如何得到结果。
  1. afoe=test1 afoo=test2 afoo=tes
  2. t3 afoe=test4 afoo=test5
复制代码
我要得到
  1. test2
  2. test3
  3. test5
复制代码

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
2 [报告]
发表于 2014-01-23 11:53 |只看该作者
回复 1# newoz
我先扔块砖头, 坐等有人把玉给我.  
  1. echo "afoe=test1 afoo=test2 afox=test3 afoe=test4 afoo=test5" | sed -n -e 's/\b[A-Za-z0-9]*=\([A-Za-z0-9]*\)\s*/\1\n/gp'
复制代码

论坛徽章:
1
白羊座
日期:2013-12-29 17:58:28
3 [报告]
发表于 2014-01-23 12:07 |只看该作者
回复 2# q1208c


   我只要afoo 后面的内容。

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
4 [报告]
发表于 2014-01-23 12:10 |只看该作者
回复 2# q1208c


    afoe后面的是不需要的

论坛徽章:
1
白羊座
日期:2013-12-29 17:58:28
5 [报告]
发表于 2014-01-23 12:26 |只看该作者
本帖最后由 newoz 于 2014-01-23 12:30 编辑

这个就算有输出结果,也只能输出一个匹配, 还不成功
  1. sed ':a;$!{N;b a};s/.*afoo=\([:alnum:]*\).*/\1/' file
复制代码

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
6 [报告]
发表于 2014-01-23 12:26 |只看该作者
  1. $ cat i
  2. afoe=test1 afoo=test2 afoo=tes
  3. t3 afoe=test4 afoo=test5
  4. $ sed -nr ':1;N;$!b1;s/\n//g;s/\s+/\n/g;:2;/^afoo=/{s/[^=]*=//;P};s/\S+\n//;t2' i
  5. test2
  6. test3
  7. test5
复制代码
插一句:既然grep可以轻松做到,为何要用sed呢?

论坛徽章:
1
白羊座
日期:2013-12-29 17:58:28
7 [报告]
发表于 2014-01-23 12:31 |只看该作者
因为grep 不能处理换行的结果。 你这个我先理解一下

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
8 [报告]
发表于 2014-01-23 12:34 |只看该作者
回复 7# newoz
  1. echo `cat urfile` | grep xxoo
复制代码
这样可以吗?

论坛徽章:
1
白羊座
日期:2013-12-29 17:58:28
9 [报告]
发表于 2014-01-23 13:01 |只看该作者
本帖最后由 newoz 于 2014-01-23 13:04 编辑

大概看明白了, 先并成一行( :1;N;$!b1; ),然后取掉所有的换行符 (相当于 tr -d "\n") ,再按照空格转换成多行 (相当于 tr " " "\n"),这样的话,每个赋值就只占用一行了, 后面的命令就是取值了。

论坛徽章:
1
白羊座
日期:2013-12-29 17:58:28
10 [报告]
发表于 2014-01-23 13:02 |只看该作者
本帖最后由 newoz 于 2014-01-23 13:02 编辑

回复 8# Shell_HAT
我这个命令比你的好,不带多余的空格。否则后面的不好判断了。
  1. tr -d "\n" < file
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP