【问题标题】:grep outputs differently for pip list vs pip list -opip list 与 pip list -o 的 grep 输出不同
【发布时间】:2014-11-23 17:13:41
【问题描述】:

我知道有多种方法可以使用 pip 更新过时的软件包,这是我在这里尝试做的。但是,我的问题是关于此表达式给出的不同输出,具体取决于我使用的是pip list 还是pip list -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:
...

【问题讨论】:

    标签: regex grep pip


    【解决方案1】:

    该模式的问题是.*,因为. 尝试匹配包括空格在内的任何内容,而我们打算不包括空格。稍微改变一下模式就可以了

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

    这里不是尝试匹配任何东西,.* 我们尝试匹配除空格之外的任何东西[^ ]*

    它有什么作用?

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

    • [^ ]* 匹配除空格以外的任何内容,* 对其进行量化

    测试

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

    您可以使用非贪婪匹配作为

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

    【讨论】:

    • 我明白了。所以我使用的表达式匹配到 last 空间的所有内容,而不是第一个,对吗?我曾假设它会匹配第一个空格。这是默认的吗?
    • @pak .* 是贪婪的,并试图匹配到最后一个空格。你也可以使用像.*?这样的非贪婪匹配,我已经添加了这个来回答
    猜你喜欢
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    相关资源
    最近更新 更多