Linux 在文本文件中用冒号替换特定空格

Linux 在文本文件中用冒号替换特定空格,linux,sed,removing-whitespace,Linux,Sed,Removing Whitespace,我有一个在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

我有一个在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
一些随机文本也会在下面

我希望它看起来像这样:

  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来实现这一点。我认为使用awk会更容易:

awk '{ printf("%2.2s %s:%s:%s:%s:%s:%s\n", $1, $2, $3, $4, $5, $6, $7); }' file

我认为使用awk会更容易:

awk '{ printf("%2.2s %s:%s:%s:%s:%s:%s\n", $1, $2, $3, $4, $5, $6, $7); }' file

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

perl -lane '($p,$m)=/^(\s*\d+\s*)(.*)$/; $m =~ s/ /:/g; print $p,$m' input

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

perl -lane '($p,$m)=/^(\s*\d+\s*)(.*)$/; $m =~ s/ /:/g; print $p,$m' input
使用sed的一种方法:

sed 's/  */:/3g'  file
使用sed的一种方法:

sed 's/  */:/3g'  file

按照@Guru的答案,您可以使用
sed

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

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

按照@Guru的答案,您可以使用
sed
尝试此字母:

sed -r 's/(\w) +/\1:/2g' file
sed "
: doublept
   s/^\( *[[:digit:]]\{1,\}\)\( \{1,\}\)\(.*\) \([[:alnum:]]\{1,\}\)/\1\2\3:\4/
   t doublept
"
您必须先捕获一个字母,因为
sed
不支持查找

sed "
: doublept
   s/^\( *[[:digit:]]\{1,\}\)\( \{1,\}\)\(.*\) \([[:alnum:]]\{1,\}\)/\1\2\3:\4/
   t doublept
"
也适用于更大的“mac地址”(如果有的话)(我认为IP地址和IPv6主要存在同样的问题)


也适用于更大的“mac地址”(如果有)(我认为IP地址和IPv6的问题基本相同)

如果您总是知道数字的行范围,您可以使用:-

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

单引号很重要。

如果您总是知道数字的行范围,可以使用:-

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

单引号很重要。

如果数字前面有空格,比如“6”而不是“6”,这不是一个好的解决方案。@Jotne:不知道你的意思。它会处理好这些。试试这两行“6E8 B7 48 36 8C AE”和
10 00 05 00 E7 5B 9F
注意
6
前面有一个空格,第一行变成“6:E8:B7:48:36:8C:AE”,第二行变成
10 00:05:00:E7:5B:9F
之后的空格不见了。@Jotne:你提到的事情没有发生。虽然将解决方案更新为
3g
,因为冒号之前出现在专栏中。我正在发生。如果您只是从上面的Brian复制数据,则在一位数前面有2个空格,在两位数前面有1个空格。所以现在它和上面给出的数据一起工作。但如果空间被移除,它将无法工作。Jerrys
awk
和Bentoy13s
sed
工作正常,前面有空格或没有空格。如果数字前面有空格,比如“6”而不是“6”,这不是一个好的解决方案。@Jotne:不确定你的意思。它会处理好这些。试试这两行“6E8 B7 48 36 8C AE”和
10 00 05 00 E7 5B 9F
注意
6
前面有一个空格,第一行变成“6:E8:B7:48:36:8C:AE”,第二行变成
10 00:05:00:E7:5B:9F
之后的空格不见了。@Jotne:你提到的事情没有发生。虽然将解决方案更新为
3g
,因为冒号之前出现在专栏中。我正在发生。如果您只是从上面的Brian复制数据,则在一位数前面有2个空格,在两位数前面有1个空格。所以现在它和上面给出的数据一起工作。但如果空间被移除,它将无法工作。Jerrys
awk
和Bentoy13s
sed
工作正常,无论前面是否有空格。