정규식 검색 패턴을 적용하기 위해 grep을 사용하여 파일을 한 줄로 처리하는 방법은 무엇입니까?

정규식 검색 패턴을 적용하기 위해 grep을 사용하여 파일을 한 줄로 처리하는 방법은 무엇입니까?

특정 줄 사이의 모든 항목을 일치시키기 위해 정규식을 사용하고 싶지만 시작과 끝은 일치하지 않습니다. 나에게 그것은 긍정적인 되돌아보기와 긍정적인 전망처럼 들린다.

    start text
    bla bla 
    bla
    end

이러한 블록이 여러 개 있으므로 모두 추출하고 각 블록에 대해 다른 정규식을 기반으로 무언가를 추출하고 싶습니다. 따라서 다음과 같아야 합니다.

match start 
then match everything until the first occurrence of end
match start 
then match everything until the first occurrence of end

등...

그래서 저는 다음과 같이 했습니다: (?<=start).*(?=end)

파일을 일련의 줄로 취급하고 각 줄에 정규식을 적용하려고 시도하는 명령줄 grep을 사용할 것이라고 생각했기 때문에 이것은 작동하지 않습니다. 파일을 전체 줄로 처리할 수 있는 방법이 있습니까? 아니면 이것이 좋은 솔루션이 아니며 sed를 사용하여 텍스트를 추출한 다음 연결이 포함된 줄로 파일을 작성하는 것과 같은 다양한 명령줄 도구의 조합을 사용해야 합니다. 초기 문서의 줄?

답변1

a'r이 나보다 먼저 sed 솔루션을 찾았으므로 이에 상응하는 perl 솔루션을 게시하겠습니다.

perl -ne 'print if/start/../end/'

좀 길긴 하지만요.

답변2

이 경우 sed가 더 쉬울 수 있습니다.

sed -ne '/start/,/end/p'

또 다른 sed 표현식은 일치하는 행을 함께 결합합니다.

sed -ne '/start/ba; be;' \
     -e ':a; N; /end/{s/\n/ /g; p; be;}; ba' \
     -e :e

a행이 일치하면 첫 번째 부분은 label 로 분기되고 /start/, 그렇지 않으면 e(end)로 분기됩니다.

두 번째 부분은 줄을 반복하면서 일치하는 줄을 찾을 때까지 패턴 공간에 추가하고 /end/, 새 줄을 공백으로 바꾸고 해당 줄을 인쇄한 다음 e(끝)으로 분기합니다.

세 번째 부분은 레이블만 제공합니다 e.

관련 정보