免费注册 查看新帖 |

Chinaunix

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

[文本处理] 关于*替换 [复制链接]

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-04-14 16:30 |只看该作者 |倒序浏览
大家好,今天在qq群里看到一个问题很有意思,但是搞不懂,请大神指点一下
root@compute02:/# echo "abc" |sed 's/b*/1/g'
1a1c1
root@compute02:/# echo "abc" |sed 's/a*/1/g'
1b1c1
root@compute02:/#
这个问题怎么解释呢?

论坛徽章:
2
luobin
日期:2016-06-17 17:46:36lufei
日期:2016-06-17 17:49:16
2 [报告]
发表于 2016-04-14 16:53 |只看该作者
b*表示b重复一次或者0次。。如果想把b替换掉,我觉得你写成echo "abc" |sed 's/bb*/1/g'

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00
3 [报告]
发表于 2016-04-14 17:05 |只看该作者
如何我清楚啊,我只是对这个结果感到迷惑,我的这两个语句如何解释呢?回复 2# hz_oracle


   

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
4 [报告]
发表于 2016-04-14 17:23 |只看该作者
九方流云 发表于 2016-04-14 16:30
大家好,今天在qq群里看到一个问题很有意思,但是搞不懂,请大神指点一下
root@compute02:/# echo "abc" | ...

首先模式 b* 中的 * 号匹配范围 0~任意次; 也就是能够匹配字符 b 0次或任意次;
第一次匹配从位置0开始匹配 (即: a之前的位置, 用b 尝试匹配 a, 失败, 但是由于 * 号的作用 b* 等价于匹配0个b 换句话说: b* 会永远匹配成功; 至此字符1被替换到字符a之前的位置)
其他依次类推...
如有遗漏还请大家补充, 哪里有错直接拍砖.

论坛徽章:
2
luobin
日期:2016-06-17 17:46:36lufei
日期:2016-06-17 17:49:16
5 [报告]
发表于 2016-04-14 17:33 |只看该作者
回复 3# 九方流云


    我是这么理解的 b*表示0个或1个b,abc的a前面0个b,中间一个b,c后面也是0个b,所以替换动作要执行三次

论坛徽章:
1
摩羯座
日期:2014-12-29 15:59:36
6 [报告]
发表于 2016-04-14 17:38 |只看该作者
  1. > awk 'BEGIN{print gensub(/b*/, 1, "g", "abc")}'
  2. 1a1c1

  3. > perl -e '$_="abc";s/b*/1/g;print "$_\n"'
  4. 1a11c1

  5. > ruby -e 'p "abc".gsub(/b*/, "1")'
  6. "1a11c1"

  7. >js -e 'print("abc".replace(/b*/g,"1"))'
  8. 1a11c1
复制代码

比起 sed 和 awk,其他语言的正则实现更合理,在 b 和 c 之间还有一个位置能够匹配。

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
7 [报告]
发表于 2016-04-14 17:45 |只看该作者
@九方流云
我说的也许不完全正确, sed 在进行匹配时可能是按照字符进行计算的 (并非按照字符位置进行匹配), 我上面那个只能算是开了个头,
原理我不清楚, 只是按照自己的理解说下. 详细的东西还得有劳板块大神来解释了, 我发现越是看着简单的东西要说明白, 肚子里没点货还真不行.

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
8 [报告]
发表于 2016-04-14 17:49 |只看该作者
ziyunfei 发表于 2016-04-14 17:38
比起 sed 和 awk,其他语言的正则实现更合理,在 b 和 c 之间还有一个位置能够匹配。

总结的太到位了, 的确如此. 学习了.

论坛徽章:
1
15-16赛季CBA联赛之江苏
日期:2016-10-26 16:19:04
9 [报告]
发表于 2016-04-14 17:51 |只看该作者
是这个意思回复 5# hz_oracle


   

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00
10 [报告]
发表于 2016-04-14 17:55 |只看该作者
是的,确实是这样。回复 5# hz_oracle


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP