sed-regexp模式误解

sed-regexp模式误解,sed,Sed,我尝试通过sed解析log prase: echo 195.236.222.1 - - [24/Jul/2012:07:35:25 +0300] "GET / HTTP/1.1" 200 387 "http://www.google.fi/url?sa=t&rct=j&q=tarinat&source=web&cd=9&ved=0CGoQFjAI&url=http%3A%2F%2Fwww.suomi24.fi%2F&ei=XyQOUKi0C

我尝试通过sed解析log prase:

echo 195.236.222.1 - - [24/Jul/2012:07:35:25 +0300] "GET / HTTP/1.1" 200 387 "http://www.google.fi/url?sa=t&rct=j&q=tarinat&source=web&cd=9&ved=0CGoQFjAI&url=http%3A%2F%2Fwww.suomi24.fi%2F&ei=XyQOUKi0CeWA4gTjz4D4Cg&usg=AFQjCNE6wg5zPXup3d3PRoqU-BtpiNCccw" "Mozilla/5.0 (Windows NT 6.1; rv:13.0) Gecko/20100101 Firefox/13.0.1" |
sed -r 's/.*(\&q=.*)\&.*/\1/'
我希望获得&q=tarinat,但不幸的是:

\&q=tarinat&source=web&cd=9&ved=0CGoQFjAI&url=http%3A%2F%2Fwww.suomi24.fi%2F&ei=XyQOUKi0CeWA4gTjz4D4Cg
我不明白为什么我要把整根绳子拖到最后。任何帮助或提示都将不胜感激。

regex.*非常贪婪。你不希望它贪婪,所以你可能应该写:

sed -r 's/.*(\&q=[^&]*)\&.*/\1/'
正则表达式是贪婪的。你不希望它贪婪,所以你可能应该写:

sed -r 's/.*(\&q=[^&]*)\&.*/\1/'
这个女孩很贪婪。您可以将其替换为负数字符匹配[^&]*,表示匹配除a&character以外的任何字符

echo 195.236.222.1 - - [24/Jul/2012:07:35:25 +0300] "GET / HTTP/1.1" 200 387 "http://www.google.fi/url?sa=t&rct=j&q=tarinat&source=web&cd=9&ved=0CGoQFjAI&url=http%3A%2F%2Fwww.suomi24.fi%2F&ei=XyQOUKi0CeWA4gTjz4D4Cg&usg=AFQjCNE6wg5zPXup3d3PRoqU-BtpiNCccw" "Mozilla/5.0 (Windows NT 6.1; rv:13.0) Gecko/20100101 Firefox/13.0.1" |
sed -r 's/.*(\&q=[^&]*)\&.*/\1/'
这个女孩很贪婪。您可以将其替换为负数字符匹配[^&]*,表示匹配除a&character以外的任何字符

echo 195.236.222.1 - - [24/Jul/2012:07:35:25 +0300] "GET / HTTP/1.1" 200 387 "http://www.google.fi/url?sa=t&rct=j&q=tarinat&source=web&cd=9&ved=0CGoQFjAI&url=http%3A%2F%2Fwww.suomi24.fi%2F&ei=XyQOUKi0CeWA4gTjz4D4Cg&usg=AFQjCNE6wg5zPXup3d3PRoqU-BtpiNCccw" "Mozilla/5.0 (Windows NT 6.1; rv:13.0) Gecko/20100101 Firefox/13.0.1" |
sed -r 's/.*(\&q=[^&]*)\&.*/\1/'
使用grep的一种简单方法:

结果:

&q=tarinat
使用grep的一种简单方法:

结果:

&q=tarinat

注释应该被转置,而你缺少了一个结尾。@Thor:现在你知道为什么我不是复印打字员了;我不能复制!注释应该被转置,而你缺少了一个结尾。@Thor:现在你知道为什么我不是复印打字员了;我不能复制!