这是原始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命令,但也不起作用。
有什么想法吗?谢谢
或者如果有分隔符,只使用awk 'print $4'
。
sed可能不是这项工作的最佳工具。我个人会用Python或类似的语言编写一个解析器。
然而,如果您想使用终端中的正则表达式来获取它,也许可以使用grep:
% grep -o '(b[[:xdigit:]]{2}[[:space:]])+' orig
16
a3 e8 55 cc
请注意,"16"是一个十六进制对。
cut命令怎么样?
或者将Johnyweb的想法再进一步,
$:> printf "16 Out (USB URB Function: 45) 0.01513 2048 a3 e8 55 cc correpondant asciin"
| grep -o '(b[[:xdigit:]]{2}[[:space:]]b[[:xdigit:]]{2}[[:space:]])+'
产生
a3 e8 55 cc
如果您有一个可以依赖的新GNU sed,那么您应该能够轻松地将grep-regex转换为sed。
并且,为了说明buruzaemon的切割技术
$:> printf "16 Out (USB URB Function: 45) 0.01513 2048 a3 e8 55 cc correpondant asciin"
| cut -c54-66
产生
a3 e8 55 cc
但这是假设您的ID列(以及其他列)不会改变大小。
我希望这能有所帮助。