问题描述
||
这是来自原始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命令,但是它也不起作用。
有任何想法吗 ?谢谢。
解决方法
sed可能不是这项工作的最佳工具。我将亲自使用Python或类似语言编写解析器。
但是,如果您想使用Terminal中的正则表达式来获取它,则可以使用grep:
% grep -o \'\\(\\b[[:xdigit:]]\\{2\\}[[:space:]]\\)\\+\' orig
16
a3 e8 55 cc
注意\“ 16 \”是十六进制对。
, 或如果有分隔符,仅使用awk \'print $4\'
。
, cut命令怎么样?
, 或将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 regex转换为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列(以及其他列)不会更改大小。
我希望这有帮助。