尾随文件时如何在“ n”个空格中插入空格或字符?

时间:2018-10-04 23:44:16

标签: 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 01011011

如果可以使用sed来插入空格,那就太好了。

空格必须是每8个字符-始终在八位字节的最后一个:之后的二进制数据中出现(但八位字节缺少我想看到的空格)。

1 个答案:

答案 0 :(得分:3)

此代码可与sed的GNU和BSD(macOS)版本一起使用:

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;还有一个{{1} },但我不使用它,外加一个单位的8位二进制数字(捕获为\2),后跟一个非空白(捕获为\3)。它将它们替换为\4

由于\1\3 \4必须是下一个8位二进制数字序列的一部分,因此需要循环而不是替代命令上的\4修饰符。

FWIW:我在包含以下内容的文件g中编写了代码:

sed.script

然后运行:

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

有时候这可能是一种有用的技术。在这里,这并不重要,但是可以简化工作,尤其是当您需要在sed脚本中处理引号(单引号,双引号,反引号)时。该文件不受解释正则表达式内容的shell的影响。