Regular-Expression
為什麼 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
. 當然,我總是可以將輸出通過管道傳輸到其他內容中以刪除空白行,但我寧願第一次就正確。我懷疑這個問題與正則表達式無關,相反,它是
ag
‘s和flags 的一個特徵--context
,但我找不到可以滿足我要求的這些組合。--after``--before
有任何想法嗎?
它不是
--context
,而是\s*
您的正則表達式模式的開頭。它似乎ag
不像 normal 那樣逐行搜尋grep
,而是一次查看整個文件(或一次至少幾行)。有點像這樣 Perl 單線會:perl -0777 -ne 'print "$&\n" while /^\s*(def|class)\s+[_A-Za-z]*/msg' ../prog.py
因此,由於
\s
匹配任何空格,包括換行符,它匹配前一個空行、換行符、下一個空格,然後是def
關鍵字。如果您在該行之前添加一個空行blah
,則不會列印它,因為blah
它不適合該模式。要擺脫不需要的匹配,請使用
/^ *...
or/^[ \t]*...
代替/^\s*...
. (第一個空格+星號)