免费注册 查看新帖 |

Chinaunix

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

[文本处理] 已经解决.结贴 命令 sed - 文本替换失败 ([-i]选项使用位置) [复制链接]

论坛徽章:
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
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-08-30 15:49 |只看该作者 |倒序浏览
本帖最后由 sunzhiguolu 于 2015-09-15 13:42 编辑

我有一个名为contacts的文档其中记录了一些联系人的信息.并且其中包含5个字段以":"冒号进行分割,分别为如下字段:
姓氏:名字:所属组.工作单位:电话号码:名字缩拼
字段示意:
所属组:g<12345>.工作单位 , 工作单位使用大写首字母表示,例如:医院 <=> YY , 机关 <=> JG , 12345表示电话号码
示例:
zhang:san:g<12345>.YY:888:zs
li:si:g<12345>.JG:999:ls

我希望将contacts文档中所属组在g<12345>中的那些联系人,将所属组后面的 ".YY" 或者 ".JG" 替换为 ":wk<yy>" 或者 ":wk<jg>"

替换后的结果如下:
zhang:san:g<12345>:wk<yy>:888:zs
li:si:g<12345>:wk<jg>:999:ls

观看了一下执行效果:
此处的输出结果按照预期成功的进行了替换操作,并将大写转换成小写的形式.
  1. sed -nr '
  2. /g<12345>/{
  3. s/\.([a-z]{2})/:wk<\L\1\E>/ip
  4. }' contacts
复制代码
实际操作的sed命令:
  1. sed -ir '
  2. /g<12345>/{
  3. s/\.\([a-z]{2}\)/:wk<\L\1\E>/i
  4. }' contacts
复制代码
执行后,没有任何提示.利用grep 命令查看结果contacts文档没有发生任何改变.

还请各位热心朋友帮忙看下,我在命令的什么地方出了问题!

论坛徽章:
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
2 [报告]
发表于 2015-08-30 17:40 |只看该作者

论坛徽章:
12
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00程序设计版块每日发帖之星
日期:2016-01-19 06:20:0015-16赛季CBA联赛之江苏
日期:2016-01-17 15:31:3915-16赛季CBA联赛之上海
日期:2016-01-16 15:44:3015-16赛季CBA联赛之浙江
日期:2016-01-15 20:38:1815-16赛季CBA联赛之北京
日期:2016-01-09 14:30:15CU十四周年纪念徽章
日期:2016-01-07 12:31:5115-16赛季CBA联赛之四川
日期:2016-01-01 11:49:1515-16赛季CBA联赛之深圳
日期:2015-12-24 14:23:4115-16赛季CBA联赛之山西
日期:2015-12-15 16:22:31技术图书徽章
日期:2015-12-10 17:41:0015-16赛季CBA联赛之北控
日期:2016-02-03 10:03:24
3 [报告]
发表于 2015-08-30 18:21 |只看该作者
sed -i -r '/g<12345>/{s/\.([a-z]{2})/:wk<\L\1\E>/i}'
http://bbs.chinaunix.net/thread-4164034-1-1.html

按道理[a-z]应该是匹配不到的,至少得写成[A-Z]啊,个人觉得写成[^:]更好,请大神解释下。。
另外最后的i是干嘛的。。

评分

参与人数 2可用积分 +30 信誉积分 +8 收起 理由
sunzhiguolu + 8 很给力!
王楠w_n + 30 每日回帖奖励

查看全部评分

论坛徽章:
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 [报告]
发表于 2015-08-30 18:42 |只看该作者
本帖最后由 sunzhiguolu 于 2015-08-30 18:58 编辑

回复 3# sync_1521
i选项,意为匹配时忽略大小写.
  1. sed -n -r '
  2. s/^ZHANG:SAN/bang/ip' contacts
复制代码
你给的链接我看了,对我帮助非常大. 再次送上谢意.

论坛徽章:
12
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00程序设计版块每日发帖之星
日期:2016-01-19 06:20:0015-16赛季CBA联赛之江苏
日期:2016-01-17 15:31:3915-16赛季CBA联赛之上海
日期:2016-01-16 15:44:3015-16赛季CBA联赛之浙江
日期:2016-01-15 20:38:1815-16赛季CBA联赛之北京
日期:2016-01-09 14:30:15CU十四周年纪念徽章
日期:2016-01-07 12:31:5115-16赛季CBA联赛之四川
日期:2016-01-01 11:49:1515-16赛季CBA联赛之深圳
日期:2015-12-24 14:23:4115-16赛季CBA联赛之山西
日期:2015-12-15 16:22:31技术图书徽章
日期:2015-12-10 17:41:0015-16赛季CBA联赛之北控
日期:2016-02-03 10:03:24
5 [报告]
发表于 2015-08-30 19:04 |只看该作者
sed -i -r '
/g<12345>/{
s/\.\([a-z]{2}\)/:wk<\L\1\E>/i
}' contacts

要把\去掉

另外我猜测(.*)  用\1表示的话可能必须加-r 参数
所以sed -i  '/g<12345>/{s/\.\([a-z]{2}\)/:wk<\L\1\E>/i}' contacts 也是不行的 不知道是不是这样?

评分

参与人数 1可用积分 +30 收起 理由
王楠w_n + 30 每日回帖奖励

查看全部评分

论坛徽章:
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
6 [报告]
发表于 2015-08-30 19:10 |只看该作者
本帖最后由 sunzhiguolu 于 2015-08-30 19:36 编辑

回复 5# sync_1521
关于 -i 选项 -r 选项 , 方才我的理解是有问题的.
就像刚才您说的那样,使用 -r 选项时应该去掉 捕获型括号前面的转义符 "\".

没有 -r 选项时,使用表达捕获型括号时,需要进行转义.
"\(\)"


论坛徽章:
12
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00程序设计版块每日发帖之星
日期:2016-01-19 06:20:0015-16赛季CBA联赛之江苏
日期:2016-01-17 15:31:3915-16赛季CBA联赛之上海
日期:2016-01-16 15:44:3015-16赛季CBA联赛之浙江
日期:2016-01-15 20:38:1815-16赛季CBA联赛之北京
日期:2016-01-09 14:30:15CU十四周年纪念徽章
日期:2016-01-07 12:31:5115-16赛季CBA联赛之四川
日期:2016-01-01 11:49:1515-16赛季CBA联赛之深圳
日期:2015-12-24 14:23:4115-16赛季CBA联赛之山西
日期:2015-12-15 16:22:31技术图书徽章
日期:2015-12-10 17:41:0015-16赛季CBA联赛之北控
日期:2016-02-03 10:03:24
7 [报告]
发表于 2015-08-30 19:15 |只看该作者
本帖最后由 sync_1521 于 2015-08-30 19:18 编辑

我理解错了
如果不用-r的话应该这么写

sed -i  '/g<12345>/{s/\.\([a-z]\{2\}\)/:wk<\L\1\E>/i}'

基本功不扎实

论坛徽章:
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 [报告]
发表于 2015-08-30 19:40 |只看该作者
回复 7# sync_1521
刚才我已经把sed命令再次修改了一下,非常感谢您的帮助.

   

论坛徽章:
36
摩羯座
日期:2013-09-23 16:37:312015年亚洲杯之沙特阿拉伯
日期:2015-04-14 09:10:172015亚冠之柏太阳神
日期:2015-06-25 08:48:212015亚冠之武里南联
日期:2015-07-28 09:01:082015亚冠之莱赫维亚
日期:2015-07-28 15:44:172015亚冠之柏斯波利斯
日期:2015-09-06 14:08:52白银圣斗士
日期:2015-11-25 17:06:2815-16赛季CBA联赛之吉林
日期:2015-12-09 16:59:072016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之辽宁
日期:2016-04-14 09:29:04luobin
日期:2016-06-17 17:46:3615-16赛季CBA联赛之天津
日期:2016-08-16 14:11:01
9 [报告]
发表于 2015-08-31 14:33 |只看该作者
  1. sed -r 's/\.([^:]*)/\L:wk<\1>/'
复制代码

论坛徽章:
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
10 [报告]
发表于 2015-09-01 00:28 |只看该作者
本帖最后由 sunzhiguolu 于 2015-09-01 00:31 编辑

回复 9# LikeLx
谢谢给出的命令,受教了...

有时间帮忙看下我的一个帖子:
[red hat 6.5] - [已经解决] 安装软件非要注册系统吗

小弟对make指令的错误消息不是很理解,请给点建议. 先谢过!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP