【问题标题】:Using sed to extract hex bytes from a raw usb dump使用 sed 从原始 USB 转储中提取十六进制字节
【发布时间】:2011-06-13 08:44:08
【问题描述】:

这是来自原始 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 一直在变化,而且 hex 字节的数量确实很大。

我想要做的是擦除除十六进制字节之外的所有内容。我考虑过使用 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 命令,但它也不起作用。

有什么想法吗?谢谢。

【问题讨论】:

    标签: regex macos sed


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 这几乎完成了工作,我必须再执行两个 sed 命令才能使其完美运行。谢谢!
      【解决方案3】:

      cut 命令怎么样?

      【讨论】:

        【解决方案4】:

        或者让 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。

        以及,说明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 列(以及其他列)不会改变大小。

        我希望这会有所帮助。

        【讨论】:

          猜你喜欢
          • 2021-03-29
          • 2014-08-05
          • 2021-03-16
          • 1970-01-01
          • 2015-05-22
          • 2014-02-18
          • 2011-03-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多