我有一张这样的桌子:
10.6.6.12 0:50:56:9b:a6:2
10.6.6.13 fe:9:31:b6:71:1d
我必须有这样的东西:
10.6.6.12,00:50:56:9b:a6:02
10.6.6.13,fe:09:31:b6:71:1d
A0
始终添加在 MAC 地址中任何“单独”字符之前。我尝试了以下方法但结果不好:
rpl -i ":a:" ":0a:" file.txt
答案1
cat /path/to/table | sed 's/\([ :]\)\([0-9a-f]:*\)/\10\2/g'
以上应该就是窍门了。为了解释这个表达式,序列
\([ :]\)
- 括号需要转义sed
;这是空格或冒号的匹配,后跟:\([0-9a-f]:*\)
- 十六进制数字后跟零个或多个冒号,然后是:
将被替换为:
\1
- 第一组(空格或冒号)0
- 数字零\2
- 第二组(找到的单个数字和冒号(如果存在))
示例用例:
$ echo "1.2.3.4 5:3d:c:12:3" | sed 's/\([ :]\)\([0-9a-f]:*\)/\10\2/g'
1.2.3.4 05:3d:0c:12:03
答案2
脚本
#!/usr/bin/env ruby
ARGF.readlines.map do |line|
if line =~ /^\s*$/
puts
next
end
ip, mac = line.split /\s+/
mac = mac.split(?:).map { |b| b.length != 2 ? ?0 << b : b }.join ?:
puts [ip, mac].join ?,
end
结果
$ ruby /tmp/macfix.rb /tmp/corpus
10.6.6.12,00:50:56:9b:a6:02
10.6.6.13,fe:09:31:b6:71:1d