免费注册 查看新帖 |

Chinaunix

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

[文本处理] 求助!提取文件指定文本替换到文件中指定地方[已解决] [复制链接]

论坛徽章:
1
水瓶座
日期:2014-08-30 00:42:21
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-27 01:42 |只看该作者 |倒序浏览
本帖最后由 xiao_244 于 2014-08-29 18:10 编辑

有一个1.TXT文件:
obj.id = "0x00000005" ; obj.value = "08:AC:86:1E:98:43";
obj.id = "0x00000006" ; obj.value = "08:AC:86:1E:98:46";
中间还有一些行
obj.id = "0x00000019" ; obj.value = "";
obj.id = "0x00000020" ; obj.value = "08:AC:86:1E:98:21";
obj.id = "0x00000021" ; obj.value = "hore"
就是把0x0000005那一行的"08:AC:86:1E:98:43"去掉冒号成08AC861E9843再到前面加5个不变的数字12345成1234508AC861E9843替换0x0000019那行的obj.value = ""成obj.value = "1234508AC861E9843"
最后成:
obj.id = "0x00000005" ; obj.value = "08:AC:86:1E:98:43";
obj.id = "0x00000006" ; obj.value = "08:AC:86:1E:98:46";
obj.id = "0x00000019" ; obj.value = "1234508AC861E9843";
obj.id = "0x00000020" ; obj.value = "08:AC:86:1E:98:21";

不知道大家能看懂不!!!!
求大侠帮忙, 我每个都用VI手动改,太累了
sed grep 都行 awk用不了~!

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
2 [报告]
发表于 2014-08-27 08:32 |只看该作者
没看出规律, 目测象 MAC地址.

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
3 [报告]
发表于 2014-08-27 09:22 |只看该作者
本帖最后由 seesea2517 于 2014-08-27 09:23 编辑
  1. [seesea@UC ~]$ cat ttt
  2. obj.id = "0x00000005" ; obj.value = "08:AC:86:1E:98:43";
  3. obj.id = "0x00000006" ; obj.value = "08:AC:86:1E:98:46";
  4. ...
  5. obj.id = "0x00000019" ; obj.value = "";
  6. [seesea@UC ~]$ sed -r '/0x00000005/{h}; ${G; s/://g; s/";\n.*"(.*";)/123456\1/}' ttt
  7. obj.id = "0x00000005" ; obj.value = "08:AC:86:1E:98:43";
  8. obj.id = "0x00000006" ; obj.value = "08:AC:86:1E:98:46";
  9. ...
  10. obj.id = "0x00000019" ; obj.value = "12345608AC861E9843";
复制代码

论坛徽章:
3
天蝎座
日期:2013-12-10 19:37:11酉鸡
日期:2014-08-04 20:05:38双鱼座
日期:2014-08-09 21:53:54
4 [报告]
发表于 2014-08-27 09:25 |只看该作者
回复 1# xiao_244


    是每次替换都是00005和00019这两行吗? 另外添加的数字是固定的吗?

我先把固定的情况写上(写的有点儿麻烦,希望高手改进)

  1. sed -f replace_line_from_another_line.sed 1.txt
  2. cat replace_line_from_another_line.sed
  3. /00005/{
  4.     h
  5.     s/.*obj.value.*\"\(.*\)\".*/\1/
  6.     s/://g
  7.     s/.*/123456&/
  8.     x
  9. }
  10. /00019/{
  11.     G
  12.     s/\"\";\n\(.*\)/\"\1\";/
  13. }

复制代码

论坛徽章:
1
处女座
日期:2014-09-18 16:18:00
5 [报告]
发表于 2014-08-27 09:44 |只看该作者
只会awk。。。学习sed。。。
  1. awk 'BEGIN{FS=OFS="\""}{if($2=="0x00000005"){value=$4;gsub(/:/,"",value)};if($4=="")$4="123456"value;print $0}' urfile
复制代码

论坛徽章:
5
未羊
日期:2014-08-04 16:15:21天秤座
日期:2014-08-13 13:52:372015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:112015亚冠之浦和红钻
日期:2015-06-29 15:30:48
6 [报告]
发表于 2014-08-27 10:10 |只看该作者
  1. awk '/0x00000005/{a=$NF}/0x00000019/{gsub(/:/,"",a);sub(/"/,"",a);$NF="\"123456"a}{print $0}'
复制代码

论坛徽章:
0
7 [报告]
发表于 2014-08-27 13:11 |只看该作者
本帖最后由 love_shift 于 2014-08-27 14:19 编辑
  1. #!/usr/bin/env python
  2. #v2.7

  3. import re

  4. def get_data():
  5.     with open('ex2','r') as f:
  6.          s = f.read().strip()
  7.     return s

  8. def do_it():
  9.     data = get_data()
  10.     t = [ j.split(';') for j in data.split('\n') ]
  11.     d = dict([i[0],i[1]] for i in t)
  12.     for k in sorted(d.keys()):
  13.        if re.search('0x00000005',k):
  14.           c = re.sub(r'(.*)"(\S+)("),r'\1"123456\2\3',d[k],re.S)
  15.        elif re.search('0x00000019',k):
  16.           d[k] = c
  17.        print k + ';' + d[k]+';'
  18.    
  19. if __name__ == '__main__':
  20.     do_it()

  21. root@ubuntu:~/cu_test# more ex2
  22. obj.id = "0x00000005" ; obj.value = "08:AC:86:1E:98:43";
  23. obj.id = "0x00000006" ; obj.value = "08:AC:86:1E:98:46";
  24. obj.id = "0x00000019" ; obj.value = "";
  25. obj.id = "0x00000020" ; obj.value = "08:AC:86:1E:98:21";
  26. root@ubuntu:~/cu_test# ./t.py
  27. obj.id = "0x00000005" ; obj.value = "08:AC:86:1E:98:43";
  28. obj.id = "0x00000006" ; obj.value = "08:AC:86:1E:98:46";
  29. obj.id = "0x00000019" ; obj.value = "12345608:AC:86:1E:98:43";
  30. obj.id = "0x00000020" ; obj.value = "08:AC:86:1E:98:21";
复制代码

论坛徽章:
0
8 [报告]
发表于 2014-08-27 13:38 |只看该作者
本帖最后由 love_shift 于 2014-08-27 14:25 编辑
  1. root@ubuntu:~/cu_test# more ex2
  2. obj.id = "0x00000005" ; obj.value = "08:AC:86:1E:98:43";
  3. obj.id = "0x00000006" ; obj.value = "08:AC:86:1E:98:46";
  4. obj.id = "0x00000019" ; obj.value = "";
  5. obj.id = "0x00000020" ; obj.value = "08:AC:86:1E:98:21";
  6. root@ubuntu:~/cu_test#sed -r '/0x00000005/{h};/0x00000019/{g;s/05/19/;s/(.*= )"(.*)/\1"123456\2/}' ex2
  7. obj.id = "0x00000005" ; obj.value = "08:AC:86:1E:98:43";
  8. obj.id = "0x00000006" ; obj.value = "08:AC:86:1E:98:46";
  9. obj.id = "0x00000019" ; obj.value = "12345608:AC:86:1E:98:43";
  10. obj.id = "0x00000020" ; obj.value = "08:AC:86:1E:98:21";
复制代码

论坛徽章:
1
水瓶座
日期:2014-08-30 00:42:21
9 [报告]
发表于 2014-08-27 13:39 |只看该作者
中间三点的意思是还有很多这样的行,0x0000019也不是最后一行,命令运行之后结果和我想的不一样,帮忙改一下~!回复 3# seesea2517


   

论坛徽章:
1
水瓶座
日期:2014-08-30 00:42:21
10 [报告]
发表于 2014-08-27 13:48 |只看该作者
awk设备环境下用不了,能改成SED的吗?回复 6# dn833


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP