如何在尾随文件时每隔"n"空格插入空格或字符?



我正在跟踪日志文件,并希望使其更具可读性。

当前输出如下所示:

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})([^ ])/13 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})([^ ])/13 4/

(…)表示法捕获可在替换子句中使用n引用的信息。 它们也可以筑巢。{8}需要前一个单元的 8(在本例中(。 前一个单位是[01],二进制数字。

总的来说,它捕获了最后一个冒号:加上 0 个或多个单位的 8 个二进制数字后跟一个空白(并将所有这些捕获为1;那里还有一个2,但我不使用它(,加上一个单位的 8 个二进制数字(捕获为3个(,后跟一个非空白(捕获为4(。 它用13 4替换它们。

由于4需要成为下一个 8 个二进制数字序列的一部分,因此您需要在 substitute 命令上使用循环而不是g修饰符。

FWIW:我在一个包含以下内容的文件中编写了代码sed.script

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

然后运行:

sed -f sed.script data

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

相关内容

  • 没有找到相关文章

最新更新