두 패턴 사이의 모든 텍스트(패턴이 나타나는 줄의 텍스트 포함)를 어떻게 추출합니까?

두 패턴 사이의 모든 텍스트(패턴이 나타나는 줄의 텍스트 포함)를 어떻게 추출합니까?

Bash 컨텍스트에서 추출하고 싶습니다.모든 텍스트서로 다른 라인에 있지만 전체 라인을 구성하지 않는 두 패턴 사이에서 발생합니다. 그래서 특별히 패턴이 나타나는 줄에 텍스트를 인쇄하고 싶지만 시작 패턴 뒤에서 시작하고 중지 패턴 앞에서 끝나도록 하겠습니다.

  • 예를 들어 입력이 다음과 같은 경우:
    This is line 1
    Something else
    Line 3
    
  • This그리고 패턴은3
  • 그러면 원하는 출력은 다음과 같습니다.
    is line 1
    Something else
    Line
    

답변1

grepGNU , Lookbehind (?<=This )및 Lookahead 사용 (?= 3):

grep -Poz '(?<=This )(.|\n)*(?= 3)' file

산출:

1호선이에요
다른 것들
철사

참조: man grep스택 오버플로 정규식 FAQ

답변2

Perl이 구조에 옵니다:

perl -0777 -ne 'BEGIN { ($f, $t) = (shift, shift) }
                /$f\s*(.*)\s*$t/s and print $1
               ' This 3 input.txt
  • -0777전체 파일을 메모리로 읽어와 처리하는 것을 의미하는 "후루룩 모드"를 켭니다.
  • -n코드를 통한 입력을 처리합니다.
  • 처음에 처음 두 매개변수는 $f 및 $t 변수에 저장됩니다.
  • 입력에 두 패턴 사이의 항목이 포함되어 있으면 $1에 저장되고 인쇄됩니다.

답변3

확장 정규 표현식 모드의 GNU sed

sed -E '
  /This/,/3/ s/(^|\s+)(This|3)(\s+|$)//
' file

검색어 This가 다른 텍스트에는 나타나지 않는다고 가정합니다.

답변4

그리고 sed:

$ cat file
This is line 1
This is Something else
Line 3
Line 33
This is more
data here
The 3rd bumblebee was never seen
$ sed -n '/.*This /,/ 3.*/ { s///; p; }' file
is line 1
This is Something else
Line
is more
data here
The

sed입력 파일을 출력하는 스크립트 부분을 편집합니다 . 각 섹션은 시작 패턴과 일치하는 줄로 시작 .*This하고 끝 패턴과 일치하는 줄로 끝납니다 3.*. 또한 스크립트는 시작 줄에서 시작 패턴과 일치하는 하위 문자열을 제거하고 끝 줄에서 끝 패턴과 일치하는 하위 문자열을 제거합니다.

또는,

$ sed -e '/.*This /,/ 3.*/!d' -e 's///' file
is line 1
This is Something else
Line
is more
data here
The

이는 동일한 효과를 가지지만 다르게 표현됩니다. 입력에서 원하는 부분이 아닌 부분을 제거하고, 출력하기 전에 원하는 각 부분의 시작선과 끝선을 잘라냅니다.

관련 정보