2014-11-23 247 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