나는 이런 것을 찾고 있습니다 ...
이 파일이 주어지면("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