免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: silverdust
打印 上一主题 下一主题

怎么替换文件里满足某个正则表达式的其中一部分字符 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-01-16 23:04 |只看该作者
原帖由 pvb1979 于 2006-1-16 22:22 发表
如果通过匹配前三个是a,第四个不是.符号的来awk替换可以作到吗?我一直是这么考虑的,因为

awk  'BEGIN { FS=OFS="|"}   gsub(/a/,1,$1)  gsub(/a/,1,$2)  '  的通用性不高(当然能解决问题才是关键 ...


那只是a的,如果你想把所有a 都换成1、就很好用。
你可把/a/ 变成/aaa/ 111就好了

论坛徽章:
0
12 [报告]
发表于 2006-01-16 23:11 |只看该作者
原帖由 pvb1979 于 2006-1-16 22:22 发表
如果通过匹配前三个是a,第四个不是.符号的来awk替换可以作到吗?我一直是这么考虑的,因为

awk  'BEGIN { FS=OFS="|"}   gsub(/a/,1,$1)  gsub(/a/,1,$2)  '  的通用性不高(当然能解决问题才是关键 ...


sed的哪个写的不错,能满足你说的,要判断aaa后面是什么以在前面加上 /$1~aaa[a-z]*/   也可以使用一些字符串函数

论坛徽章:
0
13 [报告]
发表于 2006-01-19 09:57 |只看该作者
可能是我没写清楚,sed 's/aaa\([a-z]\)/111\1/g' file 的写法可以满足我给出的例子,
但是在我的实际情况里,aaa后面不一定就是点".",有aaab.cccc或者aaacccc.dddd的数据,
这种数据里的aaa是不能被替换的。
简单说,如果数据里包括".",就不用替换这个域。
大家能不能再继续帮帮忙

论坛徽章:
0
14 [报告]
发表于 2006-01-19 15:18 |只看该作者

回复 13楼 silverdust 的帖子

try this
sed 's/aaa\([^aaa\.\|]*\|\)/111\1/g' file

论坛徽章:
0
15 [报告]
发表于 2006-01-19 16:37 |只看该作者
可以了,谢谢dradhzn,能不能解释一下这条语句的意思
也好举一反三
sed 's/aaa\([^aaa\.\|]*\|\)/111\1/g'中的\([^aaa\.\|]*\|\)是什么意思,满足这个条件的字符串不做替换嘛?

[ 本帖最后由 silverdust 于 2006-1-19 16:58 编辑 ]

论坛徽章:
0
16 [报告]
发表于 2006-01-19 16:53 |只看该作者
原帖由 silverdust 于 2006-1-19 16:37 发表
可以了,谢谢dradhzn,能不能解释一下这条语句的意思
也好举一反三

[^aaa\.\|]*\|

from left to right: (having a aaa infront , but ) not start with "aaa"  and do not contain a "." and a "|" , group the conditions with [ ] , apply "*" for more than one char matching . and end with a "|"

this is the regex for this single pattern that you want to be replaced .  thus , if the pattern found , use backreference \( \) and \1 to reserve this pattern .

hope you can understand .

[ 本帖最后由 dradhzn 于 2006-1-19 16:58 编辑 ]

论坛徽章:
0
17 [报告]
发表于 2006-01-19 16:56 |只看该作者
原帖由 dradhzn 于 2006-1-19 16:53 发表

[^aaa\.\|]*\|

from left to right: (having a aaa infront , but ) not start with "aaa"  and do not contain a "." and a "|" , group the conditions with [ ] , apply & ...


发现一些好的例子和精华都在英文文挡里

论坛徽章:
0
18 [报告]
发表于 2006-01-19 17:24 |只看该作者
文件里是aaa的时候,用这个条件是好用的。
但是把aaa改成数字之后,怎么就不对了呢?
文件内容
35061000198980|350610001999|350610001|350610001.334|350610001|1350610001.24|
执行命令
sed 's/350610001\([^350610001\.\|]*\|\)/350610002\1/g'
怎么出来的结果是
35061000198980|350610002999|350610002|350610001.334|350610002|1350610001.24|
第一个域里面的数字为什么没有被替换?

论坛徽章:
0
19 [报告]
发表于 2006-01-19 18:13 |只看该作者
command modified  . remove the "aaa" in [], found it's useless anyway.
sed 's/350610001\([^\.\|]*\|\)/whatever\1/g'
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP