Linux 在文本文件中用冒号替换特定空格
我有一个在linux中输出到文本文件的报告,我需要对它进行一些修改 如果对文件进行cat,则该文件的开头如下所示: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
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个空格。所以现在它和上面给出的数据一起工作。但如果空间被移除,它将无法工作。Jerrysawk
和Bentoy13ssed
工作正常,前面有空格或没有空格。如果数字前面有空格,比如“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个空格。所以现在它和上面给出的数据一起工作。但如果空间被移除,它将无法工作。Jerrysawk
和Bentoy13ssed
工作正常,无论前面是否有空格。