中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [讨论]sed,将一行中第2到第6个字符替换成*号
作者:
标题: [讨论]sed,将一行中第2到第6个字符替换成*号 上一主题 | 下一主题
pooronce
中级用户





积分 484
发帖 250
注册 2007-6-5
状态 离线
『楼 主』:  [讨论]sed,将一行中第2到第6个字符替换成*号

各位玩sed的朋友试试吧
刚开始觉得简单,但后来发现有点问题,就是不足6个字符的行,容易给多加出*号来

思考了一会儿,弄了个方案来,但很长,不满意,暂时就不贴出来献丑了,先看看各位朋友的解决方案吧 xD

2008-7-16 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
pooronce
中级用户





积分 484
发帖 250
注册 2007-6-5
状态 离线
『第 2 楼』:  

试了下,用gawk来解决倒是很简单
gawk 'BEGIN{FS=OFS=""}{a=NF;for (i=2;i^<7;i++) $i="*";NF=a;print}' ee.txt>aa.txt

再想起来,就算直接用dos批处理来做也简单的
不过还是试试用sed吧,当是个训练,嘿嘿

2008-7-16 00:06
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 3 楼』:  


sed "s/\(..\)....\(.*\)/\1\*\*\*\*\2/" a.txt




2008-7-16 10:10
查看资料  发短消息 网志   编辑帖子  回复  引用回复
pooronce
中级用户





积分 484
发帖 250
注册 2007-6-5
状态 离线
『第 4 楼』:  



  Quote:
Originally posted by HAT at 2008-7-16 10:10 AM:
sed "s/\(..\)....\(.*\)/\1\*\*\*\*\2/" a.txt

误解意思了,第2到第6个,也就是5个字符变星号
另外顶楼就说了,要注意的是,不够6个字符的行,不小心会多加出星号来,比如只有3个字符的行,要么就是没替换到,要么呢就是给多加了3个星号出来

2008-7-17 01:18
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
pooronce
中级用户





积分 484
发帖 250
注册 2007-6-5
状态 离线
『第 5 楼』:  

贴一下我的解决方案吧:
sed -r -i 'h;s/(.).{1,5}(.*)/\1\2/;x;s/(.{6}).*/\1/;s/.//;:a;/./{s/.//;x;s/(.)/\1*/;x;ba};x;' test.txt


2008-7-17 14:18
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 6 楼』:  

CU有人给出了一个简洁的方法
sed '{s/./*/2;s/./*/3;s/./*/4;s/./*/5;s/./*/6;}' urfile


   此帖被 +4 点积分        点击查看详情   
评分人:【 pooronce 分数: +4  时间:2008-7-18 16:24




2008-7-17 17:12
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 7 楼』:  



  Quote:
Originally posted by HAT at 2008-7-17 17:12:
CU有人给出了一个简洁的方法
sed '{s/./*/2;s/./*/3;s/./*/4;s/./*/5;s/./*/6;}' urfile

赞,确实是高。。。
这样的代码就向魔术,不知道答案前觉得高深莫测,知道后发现确实简单。!



致精致简!
2008-7-17 17:24
查看资料  发短消息 网志   编辑帖子  回复  引用回复
pooronce
中级用户





积分 484
发帖 250
注册 2007-6-5
状态 离线
『第 8 楼』:  



  Quote:
Originally posted by HAT at 2008-7-17 05:12 PM:
CU有人给出了一个简洁的方法
sed '{s/./*/2;s/./*/3;s/./*/4;s/./*/5;s/./*/6;}' urfile

原来可以这样确定匹配空间的,太好了,学到了 xD

有这方法,很多地方都简单多了,像上面,害得我转n个圈用循环才解决好哪-_-#


btw:请问,你说的CU是指哪里啊

2008-7-18 16:26
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 9 楼』:  

CU: ChinaUnix
http://bbs.chinaunix.net/forum-24-1.html



2008-7-18 16:45
查看资料  发短消息 网志   编辑帖子  回复  引用回复
pooronce
中级用户





积分 484
发帖 250
注册 2007-6-5
状态 离线
『第 10 楼』:  

噢。。。原来是chinaunix啊,原来兄弟混迹那里的 xD

2008-7-18 17:48
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: