为什么 ag 打印该文件中的空行?

为什么 ag 打印该文件中的空行?

我想用股份公司在 python 文件中打印类及其方法。我认为这很容易使用:

ag --context=0 --nocolor -os '^\s*(def|class)\s+[_A-Za-z]*' prog.py

但由于我不明白的原因,这也匹配空行。例如,如果您将 prog.py 设为以下内容

class MyFavouriteClass
    def __init__

    def __contains__
        blah    
class MyNextFavouriteClass
    def _repr_

    def __iter__

然后它返回完整的文件,包括空行,除了对于包含blah.当然,我总是可以将输出通过管道传输到其他内容中以删除空行,但我宁愿第一次就把它做好。

我怀疑这个问题与正则表达式无关,相反,它是ags--context和flags 的一个功能--after--before但我找不到这些功能的组合来满足我的要求。

有任何想法吗?

答案1

它不是--context,而是\s*正则表达式模式开头的 。它似乎ag不像正常那样逐行搜索grep,而是一次性查看整个文件(或一次至少几行)。有点像 Perl 单行代码:

perl -0777 -ne 'print "$&\n" while /^\s*(def|class)\s+[_A-Za-z]*/msg' ../prog.py

因此,由于\s匹配任何空格(包括换行符),因此它匹配前一个空行、换行符、下一个空行前面的空格,然后是关键字def。如果您在该行之前添加一个空行blah,则不会打印该行,因为blah它不适合该模式。

要消除不需要的匹配,请使用/^ *.../^[ \t]*...代替/^\s*...。 (第一个空格+星号)

相关内容