sed 中的反向匹配,替换找到的相反内容

sed 中的反向匹配,替换找到的相反内容

假设我的系统日志有这样的输出,

precalculated src_hash => 20 bytes @ 0x7f811c001e20
A6 2D E5 CD 2A BA F0 42 56 66 19 D4 61 1A E3 A0  .-..*..BVf..a...
C7 5E 5F 77                                      .^_w
precalculated dst_hash => 20 bytes @ 0x7f811c0020d0
15 EC 34 59 89 0F 4F F8 C5 68 3A DC BB 09 27 91  ..4Y..O..h:...'.
5D C1 E7 28                                      ]..(

我的目标是去掉右侧的 ASCII 垃圾,只留下哈希的十六进制字节,同时仍然保存以变量名开头的行。我使用的正则表达式是

(^([a-zA-Z_]+\s+)+[=]{1}) | (^([a-zA-Z0-9]{2}[\s]{1})+)

它正确匹配以变量名或包含其值的十六进制字符串开头的行。有什么方法可以反转 sed 匹配的内容以去除流中的“其他”内容?可以以某种方式将其传输到文件吗?

答案1

sed -e '/^precalculated/!s/^\(.\{47\}\).*$/\1/' < h

这将保留任何行中precalculated开头不匹配的前 47 个字符。匹配的行只是被复制。

答案2

我发现了这个模式:

sed  -e 's/^\(..\s.\{45\}\).*/\1/'

答案3

您可以将任何初始的空格分隔的十六进制数字对序列匹配到替换组中,然后重新替换该组,例如

sed -r 's/^(([[:xdigit:]]{2}\s+)+).*$/\1/'

相关内容