Linux 我怎样才能在“每个”中插入空格或字符;";跟踪文件时使用空格?

Linux 我怎样才能在“每个”中插入空格或字符;";跟踪文件时使用空格?,linux,string,bash,shell,Linux,String,Bash,Shell,我正在跟踪一个日志文件,希望它更可读 电流输出如下所示: HH:MM:SS.ss CONTROL:00011100001110101010111000000000 HH:MM:SS.ss INDICATION:00000001110101001111010101011011 HH:MM:SS.ss CONTROL:00011100 00111010 10101110 00000000 HH:MM:SS.ss INDICATION:00000001 11010100 11110101 01011

我正在跟踪一个日志文件,希望它更可读

电流输出如下所示:

HH:MM:SS.ss CONTROL:00011100001110101010111000000000
HH:MM:SS.ss INDICATION:00000001110101001111010101011011
HH:MM:SS.ss CONTROL:00011100 00111010 10101110 00000000
HH:MM:SS.ss INDICATION:00000001 11010100 11110101 01011011
我希望输出更像这样:

HH:MM:SS.ss CONTROL:00011100001110101010111000000000
HH:MM:SS.ss INDICATION:00000001110101001111010101011011
HH:MM:SS.ss CONTROL:00011100 00111010 10101110 00000000
HH:MM:SS.ss INDICATION:00000001 11010100 11110101 01011011
如果可以使用
sed
插入空格,那就太好了


空格必须每8个字符一次-它将始终位于八位字节中最后一个
之后的二进制数据中(但八位字节缺少我想要看到的空格)。

此代码适用于GNU和BSD(macOS)版本的
sed

sed -e ':a' -e 's/^\(.*:\([01]\{8\} \)*\)\([01]\{8\}\)\([^ ]\)/\1\3 \4/' -e 't a'
给定数据文件:

HH:MM:SS.ss CONTROL:00011100001110101010111000000000
HH:MM:SS.ss INDICATION:00000001110101001111010101011011
17:49:23.96 MODIFIED:0100010010101010101101010101010101001010101010111110100010011101
它给出了输出:

HH:MM:SS.ss CONTROL:00011100 00111010 10101110 00000000
HH:MM:SS.ss INDICATION:00000001 11010100 11110101 01011011
17:49:23.96 MODIFIED:01000100 10101010 10110101 01010101 01001010 10101011 11101000 10011101
第一个
-e
命令创建一个标签
a
;第三个跳转到标签
a
,如果中间的命令进行了替换(它是
sed
中的一个循环)。有趣的是中间命令:

s/^\(.*:\([01]\{8\} \)*\)\([01]\{8\}\)\([^ ]\)/\1\3 \4/
\(…\)
符号捕获替换子句中可用
\n
引用的信息。它们也可以筑巢。
\{8\}
需要上一个单元的8(在本例中)。前面的单位是二进制数字
[01]

总的来说,它捕获到最后一个冒号之前的所有内容
加上0个或更多单位的8位二进制数字,后跟一个空格(并将所有这些内容捕获为
\1
;其中还有一个
\2
,但我不使用它),再加上一个单位的8位二进制数字(捕获为
\3
),后跟一个非空格(捕获为
\4
)。它将它们替换为
\1\3\4

因为
\4
需要是下一个8位二进制数字序列的一部分,所以在替换命令上需要循环而不是
g
修饰符

FWIW:我在一个文件
sed.script
中编写了代码,其中包含:

:a
s/^\(.*:\([01]\{8\} \)*\)\([01]\{8\}\)\([^ ]\)/\1\3 \4/
t a
然后跑:

sed -f sed.script data

这有时是一种有用的技术。在这里,这并不重要,但它可以简化生活,特别是当您需要在sed脚本中处理引号-单引号、双引号和反引号时。该文件不受解释正则表达式内容的shell的影响。

tail-f growingFile | perl-pe的s/(\d{8})(?=\d)/$1/g'
这也能满足我的需要,谢谢。这……呃,让我觉得我的“评论回答”一定有问题:)(不是一个聪明的评论……这真的让我觉得)@zzxyz:是的,不,也许吧。Perl是另一种选择;我喜欢并使用它,但我也喜欢并使用
sed
。您的代码有点草率-它不坚持二进制数字,允许十进制数字序列;这可能不是一个表演的障碍。Perl中提供的lookahead使生活更加简单,因为它允许
g
修饰符工作,而不需要
sed
所需的显式循环。人们对Perl有点怀疑——它可能并不总是出现在生产机器上,而POSIX需要
sed
,而且很少会丢失它(可能在Windows上除外)。您的Perl片段工作正常。@zzxyz:如果冒号前有9个或更多连续数字,您的Perl代码也会将这些数字映射为空格。考虑到数据格式,这不太可能是一个实际问题-它要求“标签”包含9+位,这可能是不可信的。是的,我确实想到了最后一位。除了潜在的冲洗问题,sed-f似乎可以处理这些问题。啊,没关系…只是一个脚本标志。无论如何,谢谢你的直接反馈。PS-作为一个主要的Windows家伙,如果BASH安装不包括<代码> Perl <代码>(MINW,GETTO >代码> Git < /代码>控制台等),我会非常震惊。但是,如果它不包含<代码> SED,我可能甚至不认为它是BASH。