동일한 줄에 걸쳐 있든 여러 줄에 걸쳐 있든 상관없이 "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
.-l
ing할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>