正则表达式 - 搜索直到出现特定字符串
Regular Expression - search until specific string appears
我正在使用 ngrep
和 grep
从网络流量中提取一些字符串:
sudo ngrep -W byline | grep...
现在我希望 grep 搜索一个字符串并从第一个字母开始复制,直到出现一些不同的字符串。字符串是 rtmp
和 ..
例如:
"fwef-$*nVrtmp://Ggdggragravrv.com/lolwtf.mp5skill0rz%%&:/getr4kt..Glub"
应该变成:
"rtmp://Ggdggragravrv.com/lolwtf.mp5skill0rz%%&:/getr4kt"
这有可能吗?
您可以尝试下面的 grep 命令,它使用基于 positive lookahead 的正则表达式,
$ echo "fwef-$*nVrtmp://Ggdggragravrv.com/lolwtf.mp5skill0rz%%&:/getr4kt..Glub" | grep -oP 'rtmp.*?(?=\.\.)'
rtmp://Ggdggragravrv.com/lolwtf.mp5skill0rz%%&:/getr4kt
这包括 rtmp to just before
..
and .. to just before
rtmp.
和 rtmp to just before
rtmp,
和 .. to just before
..
# (?:rtmp|\.\.)(?:(?!rtmp|\.\.).)*(?=\.\.|rtmp)
(?: rtmp | \.\. )
(?:
(?! rtmp | \.\. )
.
)*
(?= \.\. | rtmp )
如果您没有可用的 perl(兼容)正则表达式,您可以使用普通的 egrep 进行匹配。但是,您必须计算出终止表达式的逆。例如,如果一个字符串恰好在 ..
之前终止,那么它匹配任何不包含 ..
的序列,这意味着它匹配任何不是句点的字符,或者句点后跟一个字符这不是一个时期。这等同于 "an optional period followed by a non-period":
$ 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
我正在使用 ngrep
和 grep
从网络流量中提取一些字符串:
sudo ngrep -W byline | grep...
现在我希望 grep 搜索一个字符串并从第一个字母开始复制,直到出现一些不同的字符串。字符串是 rtmp
和 ..
例如:
"fwef-$*nVrtmp://Ggdggragravrv.com/lolwtf.mp5skill0rz%%&:/getr4kt..Glub"
应该变成:
"rtmp://Ggdggragravrv.com/lolwtf.mp5skill0rz%%&:/getr4kt"
这有可能吗?
您可以尝试下面的 grep 命令,它使用基于 positive lookahead 的正则表达式,
$ echo "fwef-$*nVrtmp://Ggdggragravrv.com/lolwtf.mp5skill0rz%%&:/getr4kt..Glub" | grep -oP 'rtmp.*?(?=\.\.)'
rtmp://Ggdggragravrv.com/lolwtf.mp5skill0rz%%&:/getr4kt
这包括 rtmp to just before
..
and .. to just before
rtmp.
和 rtmp to just before
rtmp,
和 .. to just before
..
# (?:rtmp|\.\.)(?:(?!rtmp|\.\.).)*(?=\.\.|rtmp)
(?: rtmp | \.\. )
(?:
(?! rtmp | \.\. )
.
)*
(?= \.\. | rtmp )
如果您没有可用的 perl(兼容)正则表达式,您可以使用普通的 egrep 进行匹配。但是,您必须计算出终止表达式的逆。例如,如果一个字符串恰好在 ..
之前终止,那么它匹配任何不包含 ..
的序列,这意味着它匹配任何不是句点的字符,或者句点后跟一个字符这不是一个时期。这等同于 "an optional period followed by a non-period":
$ 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