中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-09 05:33
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [讨论]sed,将一行中第2到第6个字符替换成*号 查看 1,250 回复 9
楼 主 [讨论]sed,将一行中第2到第6个字符替换成*号 发表于 2008-07-16 00:00 ·  中国 上海 电信
中级用户
★★
积分 484
发帖 250
注册 2007-06-05 23:33
19年会员
UID 90372
性别 男
状态 离线
各位玩sed的朋友试试吧
刚开始觉得简单,但后来发现有点问题,就是不足6个字符的行,容易给多加出*号来

思考了一会儿,弄了个方案来,但很长,不满意,暂时就不贴出来献丑了,先看看各位朋友的解决方案吧 xD
2 发表于 2008-07-16 00:06 ·  中国 上海 电信
中级用户
★★
积分 484
发帖 250
注册 2007-06-05 23:33
19年会员
UID 90372
性别 男
状态 离线
试了下,用gawk来解决倒是很简单
gawk 'BEGIN{FS=OFS=""}{a=NF;for (i=2;i^<7;i++) $i="*";NF=a;print}' ee.txt>aa.txt

再想起来,就算直接用dos批处理来做也简单的
不过还是试试用sed吧,当是个训练,嘿嘿
3 发表于 2008-07-16 10:10 ·  美国 惠普HP
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
sed "s/\(..\)....\(.*\)/\1\*\*\*\*\2/" a.txt
4 发表于 2008-07-17 01:18 ·  中国 上海 电信
中级用户
★★
积分 484
发帖 250
注册 2007-06-05 23:33
19年会员
UID 90372
性别 男
状态 离线
Originally posted by HAT at 2008-7-16 10:10 AM:
sed "s/\(..\)....\(.*\)/\1\*\*\*\*\2/" a.txt


误解意思了,第2到第6个,也就是5个字符变星号
另外顶楼就说了,要注意的是,不够6个字符的行,不小心会多加出星号来,比如只有3个字符的行,要么就是没替换到,要么呢就是给多加了3个星号出来
5 发表于 2008-07-17 14:18 ·  中国 上海 浦东新区 电信
中级用户
★★
积分 484
发帖 250
注册 2007-06-05 23:33
19年会员
UID 90372
性别 男
状态 离线
贴一下我的解决方案吧:

sed -r -i 'h;s/(.).{1,5}(.*)/\1\2/;x;s/(.{6}).*/\1/;s/.//;:a;/./{s/.//;x;s/(.)/\1*/;x;ba};x;' test.txt
6 发表于 2008-07-17 17:12 ·  美国 惠普HP
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
CU有人给出了一个简洁的方法
sed '{s/./*/2;s/./*/3;s/./*/4;s/./*/5;s/./*/6;}' urfile
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
pooronce +4 2008-07-18 16:24
7 发表于 2008-07-17 17:24 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
19年会员
UID 73968
性别 男
状态 离线
Originally posted by HAT at 2008-7-17 17:12:
CU有人给出了一个简洁的方法
sed '{s/./*/2;s/./*/3;s/./*/4;s/./*/5;s/./*/6;}' urfile

赞,确实是高。。。
这样的代码就向魔术,不知道答案前觉得高深莫测,知道后发现确实简单。!
致精致简!
8 发表于 2008-07-18 16:26 ·  中国 上海 浦东新区 电信
中级用户
★★
积分 484
发帖 250
注册 2007-06-05 23:33
19年会员
UID 90372
性别 男
状态 离线
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是指哪里啊
9 发表于 2008-07-18 16:45 ·  美国 惠普HP
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
10 发表于 2008-07-18 17:48 ·  中国 上海 浦东新区 电信
中级用户
★★
积分 484
发帖 250
注册 2007-06-05 23:33
19年会员
UID 90372
性别 男
状态 离线
噢。。。原来是chinaunix啊,原来兄弟混迹那里的 xD
论坛跳转: