【问题标题】:How to extract string between a pattern and a position from the pattern with Tshark and sed如何使用 Tshark 和 sed 从模式中提取模式和位置​​之间的字符串
【发布时间】:2019-09-06 14:06:19
【问题描述】:

我遇到的问题: 使用 Tshark 和 sed 我可以在十六进制转储中获取 rtp-stream。是否可以仅获取模式和模式之后的位置之间的字节。 我举个例子: 在命令行... Tshark -x -r "C:whatever\file.pcap" -Y "rtp and frame.len==1200" | sed ¿¿¿???

我应该如何在sed中编写正则表达式? 模式是'47 00 11 1*',模式之后的位置是二和三。 例如:09 9f 5a 47 00 11 18 ce ff ff。重点是获得“ce”。

非常感谢您的帮助!

【问题讨论】:

    标签: regex sed tshark


    【解决方案1】:

    需要明确的是,这个问题的重点是正则表达式,而 sed 是一种使用正则表达式的工具(其他 bash 是 grep 和 awk)。 sed 在 linux 和 macos 之间也有所不同;这里我使用的是 GNU sed,你可能也在使用它。

    我们将使用 sed,因为它是问题陈述的一部分。

    正则表达式

    这是您的正则表达式:47 00 11 1..(..)47 00 11 1 与这些字符完全匹配。 .. 将匹配任意 2 个字符。 (..) 将捕获后面的 2 个字符,无论它们是什么。括号构成捕获组并且很重要,因为它们只返回我们关心的字符串。

    要玩转正则表达式,我建议使用 regex101。您可以在 regex101 here 上探索这个特定的正则表达式和测试用例。

    到 Sed 的管道

    您的问题使用 sed,所以这是

    bash-5.0$ echo "09 9f 5a 47 00 11 18 ce ff ff" | sed -n 's/.*47 00 11 1..\(..\).*/\1/p'
    ce
    

    这里,除了 sed 要求之外,正则表达式是相同的:

    • .*: .* 匹配任意数量的字符。将其添加到开头和结尾将完全匹配字符串。
    • \(,\):sed 需要转义括号来表示捕获组

    其他组件如下:

    • -n: 对模式的内部处理保持沉默
    • s/:替换为捕获组提供的字符串
    • \1:替换为捕获组 1
    • /p:打印结果(与开头的/s结合使用)

    注意:像 Perl 这样的许多语言都支持称为 PCRE 的正则表达式标准(Perl C兼容 Regular Expressions),比 sed 语法更容易使用。根据我的经验,使用 Perl 或 Python 内联正则表达式比使用 sed(或 grep 或 awk)更容易。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-21
      • 1970-01-01
      • 2011-10-08
      • 2023-02-04
      相关资源
      最近更新 更多