免费注册 查看新帖 |

Chinaunix

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

[文本处理] shell字符串处理 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-05-13 23:17 |只看该作者 |倒序浏览
本帖最后由 gigglesun 于 2013-05-13 23:24 编辑

A=“fe:48:00:00:03:00:00:02:00:10:00:09:c9:03:b2:58"
转换规则:
从字符串首开始,每5个字符为一组,组之间“:”保留,如fe:48为一组,
第二组为00:00....最后一组为b2:58。每组中冒号去掉,从左到右后连续的0去掉,如全部为0,保留一个0,如:

  1. fe:48->fe48
  2. 00:00->0
  3. 03:00->300
  4. 00:02->2
  5. 00:10->10
  6. 00:09->9
  7. c9:03->c903
  8. b2:58->b258
复制代码
转换后:
B="fe48:0:300:2:10:9:c903:b258"
尽量少用中间变量,如何将该字符串转换为B,请高手指点,谢谢

论坛徽章:
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
2 [报告]
发表于 2013-05-13 23:20 |只看该作者
fe48和300中间的第二段0是否要呢???

论坛徽章:
0
3 [报告]
发表于 2013-05-13 23:25 |只看该作者
需要,B就是想要的,刚写漏了
回复 2# dn833


   

论坛徽章:
4
白羊座
日期:2013-09-17 21:59:30技术图书徽章
日期:2013-10-12 22:16:03白羊座
日期:2013-10-14 11:01:40双子座
日期:2013-12-17 18:26:39
4 [报告]
发表于 2013-05-14 00:23 |只看该作者
  1. sed 's/\(..\):\(..\)/\1\2/g;s/\<0*\([0-9]\)/\1/g' input
复制代码

论坛徽章:
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
5 [报告]
发表于 2013-05-14 08:25 |只看该作者
  1. sed -r 's/(..):(..)/\1\2/g;s/:(0*)([0-9])/:\2/g'
复制代码
&跟四楼思路一样

论坛徽章:
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
6 [报告]
发表于 2013-05-14 11:13 |只看该作者
没想到写了这么复杂的 awk:
  1. [seesea@UC ~]$ B=$(echo -n $A | awk -v RS=":" -v ORS=":" '{getline nextline; $0=$0""nextline; sub(/^0*/, "", $0); $0=$0==""?0:$0; result=result=="" ? $0 : result ORS $0} END{printf result}')
  2. [seesea@UC ~]$ echo $B
  3. fe48:0:300:2:10:9:c903:b258
复制代码

论坛徽章:
0
7 [报告]
发表于 2013-05-20 22:29 |只看该作者
  1. echo fe:48:00:00:03:00:00:02:00:10:00:09:c9:03:b2:58|awk -F":" '{while(++i<=NF){if(i%2==1){if($i=="00")$i="";if(int($i))$i=int($i);printf $i;}if(i%2!=1){if($(i-1)>0)printf $i;else printf int($i);printf ":"}}}END{printf "\b \n"}'
复制代码
唉 写了串又臭又长的命令
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP