linux - 如何在拖尾文件时每隔 "n"个空格插入空格或字符?

标签 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 个字符 - 它始终是八位字节中最后一个 : 之后的二进制数据(但八位字节缺少我想要看到的空格)。

最佳答案

此代码适用于 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;如果中间的命令进行了替换(这是 sed 中的循环),则第三个跳转到标签 a。乐趣就在于中间的命令:

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 的影响。

关于linux - 如何在拖尾文件时每隔 "n"个空格插入空格或字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52656486/

相关文章:

bash - Unix : Count occurrences of similar entries in first column, 求和第二列

linux - BASH 脚本 : take a filename (with spaces) as argument and use name (no ext) and also full filename as args for scripted command

linux - 如何更改 ELF 中代码段的对齐方式

python - Python 的 str.rstrip() 函数中的错误,还是我自己的愚蠢?

c - 我的信号处理程序示例不工作

R/Stringr 在第 n 次出现 "_"后提取字符串并以第一次出现 "_"结束

php - 向MySQL插入字符串后,字符 '\n'(换行符)消失

json - JQ 从编码字段内部替换 "\n"

linux - 安装 Qt 5.2.1 并使 pkg-config 识别它

c - 将 linux framebuffer 用于图形但禁用控制台文本