Chinaunix

标题: 如何只保留每个字段的第二个字符,如将24:b8:05:a8处理成4:8:5:8 [打印本页]

作者: linuxer001    时间: 2008-06-06 16:42
标题: 如何只保留每个字段的第二个字符,如将24:b8:05:a8处理成4:8:5:8
现在有字符串24:b8:05:a8,要去掉每个字段中第一个字符,只保留第二个字符,最后想得到的处理结果是4:8:5:8,请问该如何做?
作者: 寂寞烈火    时间: 2008-06-06 16:46
sed 's/^.//;s/:./:/g'
作者: jopener    时间: 2008-06-06 16:49
原帖由 linuxer001 于 2008-6-6 16:42 发表
现在有字符串24:b8:05:a8,要去掉每个字段中第一个字符,只保留第二个字符,最后想得到的处理结果是4:8:5:8,请问该如何做?



  1. awk -F[:] '{for(i=1;i<=NF;i++){printf substr($i,2,2);if(i<NF)printf ":"} printf "\n"}' datafile
复制代码

作者: liaosnet    时间: 2008-06-06 17:00
标题: 回复 #3 jopener 的帖子
这个好~~又简单~~
作者: zhaopingzi    时间: 2008-06-06 17:02
我来个复杂的:

  1. sed 's/:/\n/g' urfile|sed 's/^.//g'|tr -d "\n"|sed 's/./&:/g'||sed 's/:$//g'
复制代码

[ 本帖最后由 zhaopingzi 于 2008-6-6 17:04 编辑 ]
作者: linuxer001    时间: 2008-06-06 17:03
原帖由 寂寞烈火 于 2008-6-6 16:46 发表
sed 's/^.//;s/:./:/g'


谢谢!

我还有点问题,再打扰一下,这样做的结果是把24:b8:05:a8:0:45:7:9中只有一位字符的也给除去了变成了4:8:5:8::5::,如何做到只删除字段中两位的只保留第二个字符,而一位的就不处理。上面的字符串希望的结果是4:8:5:8:0:5:7:9

刚才是我没有说清楚,抱歉!
作者: linuxer001    时间: 2008-06-06 17:07
原帖由 jopener 于 2008-6-6 16:49 发表




awk -F[:] '{for(i=1;i


谢谢jopener!

我还有点问题,再打扰一下,这样做的结果是把24:b8:05:a8:0:45:7:9中只有一位字符的也给除去了变成了4:8:5:8::5::,如何做到只删除字段中两位的只保留第二个字符,而一位的就不处理。上面的字符串希望的结果是4:8:5:8:0:5:7:9

刚才是我没有说清楚,抱歉!
作者: jopener    时间: 2008-06-06 17:08


  1. awk -F[:] '{for(i=1;i<=NF;i++){printf substr($i,length($2),2);if(i<NF)printf ":"} printf "\n"}' datafile
复制代码


这个可以实现
2:3:4的这种
作者: jopener    时间: 2008-06-06 17:14
原帖由 linuxer001 于 2008-6-6 17:07 发表


谢谢jopener!

我还有点问题,再打扰一下,这样做的结果是把24:b8:05:a8:0:45:7:9中只有一位字符的也给除去了变成了4:8:5:8::5::,如何做到只删除字段中两位的只保留第二个字符,而一位的就不处理。上面 ...



下面这个有错

  1. sed 's/.\(.:\)/\1/g' file
复制代码

[ 本帖最后由 jopener 于 2008-6-6 17:58 编辑 ]
作者: linuxer001    时间: 2008-06-06 17:19
原帖由 jopener 于 2008-6-6 17:08 发表


awk -F[:] '{for(i=1;i<=NF;i++){printf substr($i,length($2),2);if(i<NF)printf ":"} printf "\n"}' datafile


还是不能把24:b8:05:a8:0:45:7:9变为我想要的4:8:5:8:0:5:7:9,兄台的处理结果为4:8:5:8::5::,谢谢jopener!
作者: linuxer001    时间: 2008-06-06 17:26
原帖由 jopener 于 2008-6-6 17:14 发表




sed 's/.\(.:\)/\1/g' file


就是这个啦,再次感谢jopener!
作者: jopener    时间: 2008-06-06 17:28
原帖由 linuxer001 于 2008-6-6 17:19 发表


还是不能把24:b8:05:a8:0:45:7:9变为我想要的4:8:5:8:0:5:7:9,兄台的处理结果为4:8:5:8::5::,谢谢jopener!



不好意思,笔误,吧length($i)写成了length($2)

awk的解决办法:

  1. awk -F[:] '{for(i=1;i<=NF;i++){printf substr($i,length($i),2);if(i<NF)printf ":"} printf "\n"}' file
复制代码


sed的解决办法(这个有错,sorry):

  1. sed 's/.\(.:\)/\1/g' file
复制代码

[ 本帖最后由 jopener 于 2008-6-6 18:09 编辑 ]
作者: ly5066113    时间: 2008-06-06 17:29
sed 's/^.\(.:\)/\1/;s/:.\([^:]\)/:\1/g'
作者: zhaopingzi    时间: 2008-06-06 17:44
我来个复杂的:

  1. sed 's/:/\n/g' urfile|sed 's/^.//g'|tr -d "\n"|sed 's/./&:/g'
复制代码

作者: springwind426    时间: 2008-06-06 18:18

  1. sed 's/[^:]\([^:]:\)/\1/g'
复制代码


如果用  

  1. sed 's/.\(.:\)/\1/g'
复制代码

话,有问题的,比如

  1. echo '24:b8:05:a8:0:5:7:9' | sed 's/.\(.:\)/\1/g'
  2. echo '24:b8:05:a8:0:5:7:9' | sed 's/[^:]\([^:]:\)/\1/g'
复制代码

看看结果就知道了
作者: blackold    时间: 2008-06-06 18:53
标题: 回复 #1 linuxer001 的帖子
  1. $ head urfile
  2. 24:b8:05:a8
  3. 24:b8:05:a8:0:45:7:9

  4. $ sed 's/[^:]\([^:]\)/\1/g' urfile
  5. 4:8:5:8
  6. 4:8:5:8:0:5:7:9
复制代码

作者: zhangshebao    时间: 2008-06-07 00:32
楼上的与楼主的要求可能还是有点出入,看这个:
sed 's/\<[0-9a-zA-Z]\([0-9a-zA-Z]\)\>/\1/g'

[ 本帖最后由 zhangshebao 于 2008-6-7 00:34 编辑 ]
作者: err7dd    时间: 2008-06-07 00:46
sed 's/.\(.\):/\1:/g'
看了上边的帖子改一下
sed 's/.\{0,1\}\(.\):/\1:/g'

[ 本帖最后由 err7dd 于 2008-6-7 00:52 编辑 ]
作者: linuxer001    时间: 2008-06-08 01:10
标题: 十分感谢各位朋友的回复!
十分感谢各位朋友的回复!
作者: 寂寞烈火    时间: 2008-06-08 01:34
来个grep的, 请测试
echo '24:b8:05:a8:0:5:7:9'|grep -o -E '..$'|xargs|tr -d ' '
作者: young1986    时间: 2008-06-08 11:10
标题: 谢谢楼上回答哈
原帖由 err7dd 于 2008-6-7 00:46 发表
sed 's/.\(.\):/\1:/g'
看了上边的帖子改一下
sed 's/.\{0,1\}\(.\):/\1:/g'



也可以这样
echo '24:b8:05:a8:0:5:7:9' | sed 's/.\?\(.:\)/\1/g'




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2