2014-11-23 791 views
-1

我知道有很多方法可以使用pip更新过时的软件包,这正是我在这里试图做的。但是,我的问题是关于此表达式给出的不同输出,具体取决于我使用pip list还是pip list -o。我试图只匹配包名称本身。对于pip list vs pip列表,grep输出不同-o

$ pip list | grep -o '^.*\ ' 
arrow 
backports.ssl-match-hostname 
bsddb3 
bzr 
chardet 
... 

与对比:

$ pip list --outdated| grep -o '^.*\ ' 
chardet (Current: 2.0.1 Latest: 
crypto (Current: 1.0.0 Latest: 
fastimport (Current: 0.9.2 Latest: 
feedparser (Current: 5.0.1 Latest: 
... 

回答

1

与模式的问题是.*因为.尝试,包括空间,因为我们的意图不包括空间匹配任何东西。在模式稍加改动就做的工作

$ pip2 list --outdated | grep -o '^[^ ]*' 

这里而不是试图去匹配任何.*我们尝试匹配一个空格[^ ]*

它做什么其他的事情?

  • ^锚在字符串的开头的正则表达式

  • [^ ]*匹配比空间等什么,*量化它

测试

$ pip2 list --outdated | grep -o '^[^ ]*' 
reportlab 
numpy 
requests 
pyparsing 
google-api-python-client 
pytz 
PyMetis 
Django 
httplib2 

OR

您可以使用非贪婪匹配的

$ pip list | grep -o '^.*?\ ' 
+0

我明白了。因此,我使用的表达式将所有内容都匹配到_last_空间,而不是第一个,是吗?我曾假设它会匹配第一个空间。这是默认的吗? – pak 2014-11-23 20:38:31

+0

@pak'。*'是贪婪的,试图匹配到最后一个空格。你也可以使用一个非贪婪的匹配,比如'。*?'我已经添加了回答 – nu11p01n73R 2014-11-24 03:52:17