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とflags--contextの機能だと思います--afterが、--before私の要件を満たすこれらの機能の組み合わせを見つけることができません。

どんなアイデアがありますか?

答え1

--contextではありませんが、\s*正規表現パターンで始まります。agNormalのように1行ずつ検索するのではなく、grepファイル全体を一度に(または一度に少なくとも2行ずつ)検索するようです。 Perlの1行のコードに似ています。

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

したがって、\s空白(改行を含む)と一致するため、前の空白行、改行、次の空白行の前の空白、キーワードと一致しますdef。行の前に空の行を追加すると、その行はパターンに合わずblah印刷されません。blah

不要な一致を削除するには、代わりに/^ *... またはを使用してください。 (最初のスペース+アスタリスク)/^[ \t]*.../^\s*...

関連情報