【问题标题】:Regular Expression - search until specific string appears正则表达式 - 搜索直到出现特定字符串
【发布时间】:2015-01-12 18:15:46
【问题描述】:

我正在使用ngrepgrep 从网络流量中提取一些字符串:

sudo ngrep -W byline | grep...

现在我想让 grep 搜索一个字符串并从第一个字母开始复制,直到出现一些不同的字符串。字符串为rtmp.. 例如:

"fwef-$*nVrtmp://Ggdggragravrv.com/lolwtf.mp5skill0rz%%&:/getr4kt..Glub"

应该变成:

"rtmp://Ggdggragravrv.com/lolwtf.mp5skill0rz%%&:/getr4kt"

这有可能吗?

【问题讨论】:

    标签: regex linux grep rtmp ngrep


    【解决方案1】:

    您可以尝试以下使用基于positive lookahead 的正则表达式的 grep 命令,

    $ echo "fwef-$*nVrtmp://Ggdggragravrv.com/lolwtf.mp5skill0rz%%&:/getr4kt..Glub" | grep -oP 'rtmp.*?(?=\.\.)'
    rtmp://Ggdggragravrv.com/lolwtf.mp5skill0rz%%&:/getr4kt
    

    【讨论】:

    • 用准确的输入更新您的问题。
    • @RainerZufall - rtmp 之前的“..”是什么意思?可以是.. rtmprtmp .. 甚至rtmp rtmp.. .. 吗?
    • @sln 好的,谢谢。这个如何?输入: “...... MP3:MP3 / 19695c8f0fcbe45521908c3ec60f8f96554a523e过期= 1421093669&签名= KstuSlKVypnPEF6Ird.zT52iys5yNCGVIPV1PfMCk35ZMdBPCKmnqVdKp1QjQpT8aBp4MlBHAriQjlFCDEwq98ZiFXctlDxdADDeiAlkOu0ByOWDjlCA9zn1LEmiqHIQlmqb0FsruhaD〜XaqL1G.BbuQoZ6sGZw12jsgA1YIv8JgDXafQrDcU9HL1yja〜8pAAr6lsarl7q3kb97oqJhTGecBYqlqA0dcuDig0A62BQJYxqGk84xfDy6jpbtQrAu4IqLdxVZqw98b4W0oQtMP.qbtyreZ-eaVdFN0rP2MDevoIwSAJv0〜O5MEiTp0yOxCF764F0PBrnuMWUPLnyhnt〜QWg __和密钥对-ID = APKAJXKSII4ED2EOGZZA#?” 输出:MP3 /直到#但不包括#
    • @RainerZufall - mp3/[^#]*(?=#)
    【解决方案2】:

    这包括rtmp to just before ..
    .. to just before rtmp。
    rtmp to just before rtmp,
    .. to just before ..

     # (?:rtmp|\.\.)(?:(?!rtmp|\.\.).)*(?=\.\.|rtmp)
    
     (?: rtmp | \.\. )
     (?:
          (?! rtmp | \.\. )
          . 
     )*
     (?= \.\. | rtmp )
    

    【讨论】:

      【解决方案3】:

      如果您没有可用的 perl(-compatible) 正则表达式,您可以使用普通 egrep 进行匹配。但是,您必须找出终止表达式的逆。例如,如果一个字符串在.. 之前终止,那么它匹配任何不包含.. 的序列,这意味着它匹配任何不是句点的字符,或者一个句点后跟一个不是时期。这与说“一个可选的句点后跟一个非句点”是一样的:

      $ echo "fwef-$*nVrtmp://Ggdggragravrv.com/lolwtf.mp5skill0rz%%&:/getr4kt..Glub" |
      > grep -oE 'rtmp:([.]?[^.])*'
      rtmp://Ggdggragravrv.com/lolwtf.mp5skill0rz%%&:/getr4kt
      

      如果终止字符串是单个字符,那就更简单了:只匹配除终止符之外的任何内容。例如,要匹配最多但不包括 ? 的字符串:

      $ echo "......mp3:mp3/19695c8f0fcbe45521908c3ec60f8f96554a523e?Expires=1421093669&..." |
      > grep -oE 'mp3/[^?]*'
      mp3/19695c8f0fcbe45521908c3ec60f8f96554a523e
      

      【讨论】:

        猜你喜欢
        • 2013-07-24
        • 2014-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多