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

Regex 使用sed从原始usb转储中提取十六进制字节,regex,macos,sed,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、类型、时间、长度一直在变化,十六进制字节的数量非常庞大 我要做的是删除除十六进制字节以外的所有内容。我考虑使用sed来替换

以下是原始usb转储中的一行:

Id  Type                        Time        Length   Hex             Ascii

16  Out (USB URB Function: 45)  0.01513     2048     a3 e8 55 cc      correpondant ascii
请注意,Id、类型、时间、长度一直在变化,十六进制字节的数量非常庞大

我要做的是删除除十六进制字节以外的所有内容。我考虑使用sed来替换不是一对数字/[字母从a到F]且位于两个空格之间的所有内容:

sed -E 's/([^ ][^a-f0-9][^a-f0-9][^ ])//g' <orig >new
只是ascii的一些部分被删除了

我在上面的基础上尝试了一些其他sed命令,但它也不起作用


有什么想法吗?谢谢。

这个命令怎么样?

这个命令怎么样?

或者如果有分隔符就用
awk'print$4'

或者如果有分隔符就用
awk'print$4'

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

但是,如果要使用终端中的正则表达式获取此信息,可以使用grep:

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

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

sed可能不是此作业的最佳工具。我个人会用Python或类似的语言编写解析器

但是,如果要使用终端中的正则表达式获取此信息,可以使用grep:

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

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

或者将约翰西韦布的想法更进一步

$:> 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
a3 e8 55 cc
如果您有一个可以依赖的新GNU sed,那么您应该能够轻松地将grep regex转换为sed

为了说明布鲁扎蒙的切割技术

$:> printf "16  Out (USB URB Function: 45)  0.01513     2048     a3 e8 55 cc      correpondant ascii\n" \
| cut -c54-66
产生

a3 e8 55 cc
a3 e8 55 cc
但这假设您的ID列(以及其他列)不会改变大小


我希望这能有所帮助。

或者将约翰西韦伯的想法更进一步

$:> 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
a3 e8 55 cc
如果您有一个可以依赖的新GNU sed,那么您应该能够轻松地将grep regex转换为sed

为了说明布鲁扎蒙的切割技术

$:> printf "16  Out (USB URB Function: 45)  0.01513     2048     a3 e8 55 cc      correpondant ascii\n" \
| cut -c54-66
产生

a3 e8 55 cc
a3 e8 55 cc
但这假设您的ID列(以及其他列)不会改变大小


我希望这会有所帮助。

这几乎完成了任务,我必须再执行两个sed命令才能使其完美工作。谢谢这几乎完成了任务,我必须再实现两个sed命令,以使其完美地工作。谢谢