使用| sed从原始USB转储中提取十六进制字节

问题描述

|| 这是来自原始USB转储的一行:
Id  Type                        Time        Length   Hex             Ascii

16  Out (USB URB Function: 45)  0.01513     2048     a3 e8 55 cc      correpondant ascii
请注意,Id,Type,Time,Length始终都在变化,十六进制字节的数量确实很大。 我想做的是擦除除十六进制字节以外的所有内容。我考虑过用sed代替不是一对数字/ [从A到F的字母]以及两个空格之间的所有内容
sed -E \'s/([^ ][^a-f0-9][^a-f0-9][^ ])//g\' <orig >new
但这给了我:
1Uun)   0.015013    2048    a3 e8 55 cc  
并且仅删除了部分ascii。 我根据上面的命令尝试了其他sed命令,但是它也不起作用。 有任何想法吗 ?谢谢。     

解决方法

        sed可能不是这项工作的最佳工具。我将亲自使用Python或类似语言编写解析器。 但是,如果您想使用Terminal中的正则表达式来获取它,则可以使用grep:
% grep -o \'\\(\\b[[:xdigit:]]\\{2\\}[[:space:]]\\)\\+\' orig 
16 
a3 e8 55 cc 
注意\“ 16 \”是十六进制对。     ,        或如果有分隔符,仅使用
awk \'print $4\'
。     ,        cut命令怎么样?     ,        或将Johnsyweb的想法进一步发展,
$:> printf \"16  Out (USB URB Function: 45)  0.01513     2048     a3 e8 55 cc      correpondant ascii\\n\" \\
| grep -o \'\\(\\b[[:xdigit:]]\\{2\\}[[:space:]]\\b[[:xdigit:]]\\{2\\}[[:space:]]\\)\\+\'
产生
a3 e8 55 cc
如果您有可以依赖的新GNU sed,则应该能够轻松地将grep regex转换为sed。 AND,以说明buruzaemon的剪切技术
$:> printf \"16  Out (USB URB Function: 45)  0.01513     2048     a3 e8 55 cc      correpondant ascii\\n\" \\
| cut -c54-66
产生
a3 e8 55 cc
但这假定您的ID列(以及其他列)不会更改大小。 我希望这有帮助。