Bash의 모든 정규식 일치에 대해

Bash의 모든 정규식 일치에 대해

나는 이런 것을 찾고 있습니다 ...

이 파일이 주어지면("foo.log"라고 부르겠습니다):

START_OF_ENTRY
line2
END_OF_ENTRY
START_OF_ENTRY
no match
END_OF_ENTRY
START_OF_ENTRY
line2
END_OF_ENTRY

다음 명령을 실행합니다.

pcregrep -M -o '(?m)^START_OF_ENTRY\nline2\nEND_OF_ENTRY$' foo.log | for match in STDIN; do echo "match: $match"; done

생산할 것입니다

match: START_OF_ENTRY
line2
END_OF_ENTRY
match: START_OF_ENTRY
line2
END_OF_ENTRY

배쉬에서 이것이 가능합니까?

답변1

Bash 정규식 일치 사용^참고로 bash에 상응하는 여러 줄과 앵커가 없는 것 같습니다 .$:

x=$(<foo.log)

printf -v re 'START_OF_ENTRY\nline2\nEND_OF_ENTRY'

while [[ $x =~ $re ]]; do 
  printf 'match: %s\n' "${BASH_REMATCH[0]}"; x=${x#*${BASH_REMATCH[0]}};
done
match: START_OF_ENTRY
line2
END_OF_ENTRY
match: START_OF_ENTRY
line2
END_OF_ENTRY

Perl을 사용하면 수정자를 사용하여 여러 줄 문맥 에서 m합계를 의미 있게 만들 수 있습니다.^$

perl -0777 -nE 'while ($_ =~ /^(START_OF_ENTRY\nline2\nEND_OF_ENTRY)$/mg) {say "match: $1"}' foo.log

관련 정보