0

我有一个输出到 linux 中的文本文件的报告,我需要对其进行一些修改。

如果你 cat 它,文件的开头是这样的:

  6 E8 B7 48 36 8C AE
  8 00 0C 85 F2 F9 07
  8 44 03 A7 C0 0D 26
  8 C8 4C 75 5C B1 55
 10 00 05 00 E7 5B 9F
 10 00 17 C5 69 49 A1
 10 00 1D A2 E7 BC F1
 12 00 16 9C 6C 53 C0
 14 00 0C 85 F2 F9 08
 26 00 05 00 E7 5B B7

一些随机文本也会在这里...

我希望它看起来像这样:

  6 E8:B7:48:36:8C:AE
  8 00:0C:85:F2:F9:07
  8 44:03:A7:C0:0D:26
  8 C8:4C:75:5C:B1:55
 10 00:05:00:E7:5B:9F
 10 00:17:C5:69:49:A1
 10 00:1D:A2:E7:BC:F1
 12 00:16:9C:6C:53:C0
 14 00:0C:85:F2:F9:08
 26 00:05:00:E7:5B:B7

一些随机文本也会在这里...

我希望使用 sed 来实现这一点。

4

6 回答 6

3

按照@Guru的回答,你可以试试这个sed

sed -r 's/(\w) +/\1:/2g' file

您必须先捕获一个字母,因为sed不支持后视。

于 2013-11-04T08:39:18.347 回答
3

我认为使用 awk 会更容易:

awk '{ printf("%2.2s %s:%s:%s:%s:%s:%s\n", $1, $2, $3, $4, $5, $6, $7); }' file
于 2013-11-04T07:53:48.750 回答
0
sed "
: doublept
   s/^\( *[[:digit:]]\{1,\}\)\( \{1,\}\)\(.*\) \([[:alnum:]]\{1,\}\)/\1\2\3:\4/
   t doublept
"

如果有的话,也适用于更大的“mac地址”(我认为主要是IP地址和IPv6的同类问题)

于 2013-11-04T10:20:47.943 回答
0

使用 sed 的一种方法:

sed 's/  */:/3g'  file
于 2013-11-04T08:17:00.487 回答
0

使用 Perl,这将适用于任意数量的对齐空间:

perl -lane '($p,$m)=/^(\s*\d+\s*)(.*)$/; $m =~ s/ /:/g; print $p,$m' input
于 2013-11-04T08:01:53.567 回答
0

如果您始终知道数字的行范围,则可以使用:-

sed 1,10s'/ /:/'g

单引号很重要。

于 2013-11-05T18:18:04.913 回答