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__

그런 다음 빈 줄을 포함한 전체 파일을 반환합니다.와는 별개로물론 include의 blah경우 항상 출력을 다른 항목으로 파이프하여 빈 줄을 제거할 수 있지만 처음에는 올바르게 수행하는 것이 좋습니다.

나는 이 문제가 정규식과 아무 관련이 없고 오히려 ags 및 flags --context의 기능 이라고 생각 --after하지만 --before내 요구 사항을 충족하는 이러한 기능의 조합을 찾을 수 없습니다.

어떤 아이디어가 있나요?

답변1

--context는 아니지만 \s*정규식 패턴으로 시작합니다. agNormal 처럼 한 줄씩 검색하는 것이 아니라 grep전체 파일을 한 번에(또는 한 번에 최소한 몇 줄씩) 검색하는 것 같습니다. Perl의 한 줄짜리 코드와 비슷합니다.

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

따라서 \s공백(줄 바꿈 포함)과 일치하므로 이전 빈 줄, 줄 바꿈, 다음 빈 줄 앞의 공백, 키워드 와 일치합니다 def. 행 앞에 빈 행을 추가하면 해당 행은 패턴에 맞지 않아 blah인쇄되지 않습니다 .blah

원치 않는 일치 항목을 제거하려면 대신 /^ *... 또는 를 사용하세요 . (첫 번째 공백 + 별표)/^[ \t]*.../^\s*...

관련 정보