regex sed在mac地址中插入冒号

baubqpgj  于 2023-05-08  发布在  Mac
关注(0)|答案(6)|浏览(452)

我有一个mac地址列表,格式如下:

412010000018
412010000026
412010000034

我想要这个输出:

41:20:10:00:00:18
41:20:10:00:00:26
41:20:10:00:00:34

我试过了,但没有工作:

sed 's/([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})/\1:\2:\3:\4/g' mac_list

我该怎么做?

hzbexzde

hzbexzde1#

这可能对你有用(GNU sed):

sed 's/..\B/&:/g' file
vfwfrxfs

vfwfrxfs2#

这就是我的方法

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

tzcvj98z3#

你必须使用正确的sed语法:

\{I\}
     matches exactly I sequences (I is a decimal integer;
     for portability, keep it between 0 and 255 inclusive).

\(REGEXP\)
     Groups the inner REGEXP as a whole, this is used for back references.

下面是一个包含前2个字段的示例命令

sed 's/^\([0-9A-Fa-f]\{2\}\)\([0-9A-Fa-f]\{2\}\).*$/\1:\2:/'

以下命令可以处理完整的MAC地址,并且易于阅读:

sed -e 's/^\([0-9A-Fa-f]\{2\}\)/\1_/'  \
     -e 's/_\([0-9A-Fa-f]\{2\}\)/:\1_/' \
     -e 's/_\([0-9A-Fa-f]\{2\}\)/:\1_/' \
     -e 's/_\([0-9A-Fa-f]\{2\}\)/:\1_/' \
     -e 's/_\([0-9A-Fa-f]\{2\}\)/:\1_/' \
     -e 's/_\([0-9A-Fa-f]\{2\}\)/:\1/'

按照@Qtax在这里发布的带有全局替换的Perl解决方案的想法,可以得到一个更短的解决方案:

sed -e 's/\([0-9A-Fa-f]\{2\}\)/\1:/g' -e 's/\(.*\):$/\1/'
ipakzgxi

ipakzgxi4#

Perl示例:

perl -pe 's/(\b|\G)[\da-f]{2}(?=[\da-f]{2})/$&:/ig' file

如果文件只有MAC地址,则可以简化为:

perl -pe 's/\w{2}\B/$&:/g' file
zyfwsgd6

zyfwsgd65#

如果awk是可接受的解决方案:

awk 'BEGIN { FS= "" }
{ for (i=1; i<=length($0) ; i++) {
      if (i % 2 == 0) { macaddr=macaddr $i ":" } 
      else { macaddr = macaddr $i }
  }
  print gensub(":$","","g",macaddr)
  macaddr=""
}' INPUTFILE

做得很好。Here you can see it in action

3zwjbxry

3zwjbxry6#

你也可以在普通的bash中使用子字符串提取:

while read p; do
  echo ${p:0:2}:${p:2:2}:${p:4:2}:${p:6:2}:${p:8:2}:${p:10:2}
done <input.txt | tee output.txt

相关问题