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

时间:2011-06-12 23:48:30

标签: regex macos sed

以下是来自原始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命令,但它也不起作用。

有什么想法吗?感谢。

4 个答案:

答案 0 :(得分:2)

如果有分隔符,只需使用awk 'print $4'

答案 1 :(得分:1)

sed可能不是这项工作的最佳工具。我个人会用Python或类似的方式编写一个解析器。

但是,如果你想使用终端中的正则表达式来获取它,也许可以使用grep:

% grep -o '\(\b[[:xdigit:]]\{2\}[[:space:]]\)\+' orig 
16 
a3 e8 55 cc 

请注意,“16”是十六进制对。

答案 2 :(得分:0)

cut命令怎么样?

答案 3 :(得分:0)

或者将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正则表达式转换为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列(以及其他列)不会改变大小。

我希望这会有所帮助。