Regex 使用sed从原始usb转储中提取十六进制字节
以下是原始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来替换
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命令,以使其完美地工作。谢谢