진주

진주

^# fish,포함된 줄부터 다음 포함된 줄까지(포함하지 않고) 파일의 모든 줄을 인쇄하는 좋은 방법은 무엇입니까 ^#?

답변1

AWK 사용:

awk '/^#/ { inblock = 0 }; /^# fish/ { inblock = 1 }; inblock'

그러면 실제로 로 시작하는 모든 블록이 인쇄됩니다 # fish. 첫 번째 블록 이후에 중지하려면:

awk 'inblock && /^#/ { exit }; /^# fish/ { inblock = 1 }; inblock'

inblock두 변형 모두 관심 있는 블록의 라인을 처리할 때 변수를 1로 설정하여 작동합니다. 1이면 마지막 inblock명령문이 기본 작업(현재 라인 인쇄)을 적용합니다.inblock

답변2

진주

정규식 반복은 line boundary # fish개행 문자에 인접한 가장 짧은(탐욕스럽지 않은) 블록이나 파일 자체의 맨 끝에서 시작하고 끝나는 블록을 찾습니다. #그런 다음 일치하는 부분을 인쇄합니다.

perl -l -0777ne 'print $& while /^#\sfish.+?(?=\n(?:#|\z))/msg' yourfile


sed -e '
   /^# fish/!d;          # havent yet seen the fish, so skip
   $b; N;                # seen the fish so grab the next line unless its the last in which case promptly show and quit
   /\n#/!s/^/\n/;        # not seen a line with "#" so go read next
   /^\n/D;               # 
   h;                    # whole block /# fish/.../#/ with us now
      s/\(.*\)\n.*/\1/;  # remove the last line, i.e., trailing # line
      p;                 # show the block now
   g;                    # retrieve orig unmodified block
   s/.*\n/\n/; D;        # keep the last line and go back for more...
' yourfile

관련 정보