하나 이상의 행에서 첫 번째 일치 항목과 첫 번째 고유 일치 항목 사이의 콘텐츠를 추출합니다.

하나 이상의 행에서 첫 번째 일치 항목과 첫 번째 고유 일치 항목 사이의 콘텐츠를 추출합니다.

동일한 줄에 걸쳐 있든 여러 줄에 걸쳐 있든 상관없이 "start_"의 첫 번째 발생과 "_end"의 첫 번째 발생 사이의 텍스트를 가져오고 싶다고 가정해 보겠습니다. 일치 항목을 포함하지 마세요.

예시 텍스트 1:

This is a start_text with start_and some_end text with_end

출력 텍스트 1:

text with start_and some

예시 텍스트 2:

This is a
start_text with
start_and some_end
text with_end

출력 텍스트 2:

text with
start_and some

많은 답변을 보았지만 모두 파일 중심이 아닌 행동 중심입니다. 콘솔 기반이라면 어떤 종류의 도구나 명령이라도 가능합니다.

답변1

그리고 perl:

$ perl -l -0777ne 'print $1 while /start_(.*?)_end/gs' your-example-2
text with
start_and some
  • perl -n각 실행에 sed -n제공되는 표현식의 패턴 입니다.e철사와 같은 입력 sed.
  • -ling할 l때 자동으로 새 ine을 추가하는 것입니다.print
  • -<octal-number>줄 바꿈 대신 주어진 값을 사용하여 레코드 구분 기호를 바이트로 설정합니다. 0777(511) 또는 0377(255) 이상의 값은 존재할 수 없는 바이트 값이므로 전체 파일이라는 하나의 레코드만 남게 됩니다.
  • *?like는 *0개 이상의 선행 원자( .여기서는 임의의 단일 문자)와 일치하지만 while은 *가능한 한 많은 원자와 *?가능한 한 적은 수와 일치하므로 마지막이 아닌 .*?첫 번째 발생까지 실행됩니다 ._end
  • s개행 문자를 일치 시키려면 패턴 일치 연산자의 플래그도 /regexp/필요 .하지만 기본적으로는 일치하지 않습니다.

당신도 그것을 사용할 수 있어야 pcregrep하지만 나는 그것이 제공하는 것을 발견했습니다(Debian 버전 8.39 2016-06-14):

$ pcregrep -Mo1 '(?s)start_(.*?)_end' your-example-2
text with
start_and some
and some

나는 그것을 설명할 수 없다. pcre2grep(버전 10.42 2022-12-11) 그러나 다음을 수행할 수 있습니다.

$ pcre2grep -Mo1 '(?s)start_(.*?)_end' your-example-2
text with
start_and some

1 기술적으로 저장하기 전에 레코드 구분 기호가 입력에서 제거됩니다.$_ 그리고출력 레코드 구분 기호( $\)는 입력 레코드 구분 기호( )와 동일하게 설정되며 , 입력 레코드 구분 기호는 이 시점에서 여전히 줄바꿈 문자이므로 출력 레코드 구분 기호가 로 설정되어 있는 $/것이 중요합니다 . 주어진 바이트 값이므로 .-l-0...-l<octal>-l -<octal>

관련 정보