以下是来自原始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命令,但它也不起作用。
有什么想法吗?感谢。
答案 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列(以及其他列)不会改变大小。
我希望这会有所帮助。