免费注册 查看新帖 |

Chinaunix

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

如何将匹配字符X替换成若干个X? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-18 11:38 |只看该作者 |倒序浏览
在sed中,我知道匹配若干个X很容易做到: /X\{m\}/
但是,如何做到将匹配的X替换成若干个X呢?
我尝试如下失败:
sed "s/X/&\{m\}/p" urfile

论坛徽章:
0
2 [报告]
发表于 2009-03-18 11:49 |只看该作者
sed 's/X/XXXXXXXXXXXXXXXXXXXXXXXXX/g' urfile

or

sed 's/\(X\)/\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1' urfile

论坛徽章:
0
3 [报告]
发表于 2009-03-18 11:51 |只看该作者
原帖由 yuchen12 于 2009-3-18 11:49 发表
sed 's/X/XXXXXXXXXXXXXXXXXXXXXXXXX/g' urfile

or

sed 's/\(X\)/\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1' urfile


楼主的意思是要用正则来做到这一点,不然要是X是100个呢?还不把人给累死》》?》

论坛徽章:
0
4 [报告]
发表于 2009-03-18 11:51 |只看该作者
原帖由 fttskyblue 于 2009-3-18 11:38 发表
在sed中,我知道匹配若干个X很容易做到: /X\{m\}/
但是,如何做到将匹配的X替换成若干个X呢?
我尝试如下失败:
sed "s/X/&\{m\}/p" urfile


我觉得/X\{m\}/ 这个模式主要是应用于查找,而不应用于目标M=?呢

直接 sed "s/X/&&&&&&&/p" urfile 就好了嘛!

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
5 [报告]
发表于 2009-03-18 12:16 |只看该作者

回复 #1 fttskyblue 的帖子

sed -e ':a' -e 's/X/&&/;/X\{m\}/!ba' urfile

论坛徽章:
0
6 [报告]
发表于 2009-03-18 12:24 |只看该作者
原帖由 ly5066113 于 2009-3-18 12:16 发表
sed -e ':a' -e 's/X/&&/;/X\{m\}/!ba' urfile

这个好!!!

论坛徽章:
0
7 [报告]
发表于 2009-03-18 12:27 |只看该作者
原帖由 ly5066113 于 2009-3-18 12:16 发表
sed -e ':a' -e 's/X/&&/;/X\{m\}/!ba' urfile

有一个问题:如果文件中某一行不含有关X,就会死循环。改一下:
sed -e ':a' -e 's/X/&&/;/X/{/X\{m\}/!ba}' urfile

perl 的正则能力很强,可以达到楼主的要求:
perl -pe 's/X/$&x55/e' file

[ 本帖最后由 dream3401 于 2009-3-18 12:30 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2009-03-18 12:28 |只看该作者
要知道s命令的第2个replacement部分是不能用正则表达式的

论坛徽章:
0
9 [报告]
发表于 2009-03-18 13:02 |只看该作者

回复 #7 dream3401 的帖子

但是这样还是有问题:
如果文件中有两个XX连一起,结果还是不对

论坛徽章:
0
10 [报告]
发表于 2009-03-18 13:22 |只看该作者
原帖由 youshuang 于 2009-3-18 13:02 发表
但是这样还是有问题:
如果文件中有两个XX连一起,结果还是不对

如果是单个的X变成5个X,不管文件中有几个X都可以用:
sed -e ':a' -e 's/X/&&/;/X/{/X\{m\}/!ba}' urfile

除非一行本来就有5个以上X,你又要将5个以上的X变成4个,就是减少。但不知道这是否是楼主的意思。

但是如果要将比如abc变成5个abc就变一下:
sed -r ':a s/abc/&&/;/abc/{/(abc){5}/!ba}' file


如果用perl的正则就更简单了。

[ 本帖最后由 dream3401 于 2009-3-18 13:25 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP