Regular-Expression

為什麼 ag 會從此文件中列印空行?

  • August 10, 2016

我想使用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*.... (第一個空格+星號)

引用自:https://unix.stackexchange.com/questions/302479