다른 패턴을 먼저 일치시킨 후 두 패턴 사이에 텍스트를 인쇄하는 방법은 무엇입니까?

다른 패턴을 먼저 일치시킨 후 두 패턴 사이에 텍스트를 인쇄하는 방법은 무엇입니까?

다음과 같은 줄을 상상해 보세요.

Some text with MATCH1_TEXT some other text and MATCH2_TEXT until MATCH3_TEXT

MATCH1_TEXT가 포함된 줄에서만 검색하여 텍스트를 찾고 싶습니다.~ 사이 MATCH2_TEXT그리고 MATCH3_TEXT.

until위의 예에서 나는 (앞과 뒤에 공백 문자를 사용하여)을 얻고 싶습니다.~까지).

답변1

예를 들어 sed를 사용하면

sed -n 's/^.*MATCH1_TEXT.*MATCH2_TEXT\(.*\)MATCH3_TEXT.*$/\1/p'

일치하는 텍스트는 한 줄에 최대 한 번만 순차적으로 발생하는 것으로 가정됩니다.

해당 줄의 어느 곳에서나 발생할 수 있는 경우 MATCH1_TEXT문제를 보는 또 다른 방법은 문제가 없는 줄을 무시하는 것입니다.

sed -n '/MATCH1_TEXT/!d;s/.*MATCH2_TEXT\(.*\)MATCH3_TEXT.*$/\1/p'

MATCH2_TEXT여러 번 발생할 수 있는 경우 , 예를 들어 입력은 다음과 같습니다.

 text MATCH1_TEXT stuff MATCH2_TEXT and MATCH2_TEXT until MATCH3_TEXT

그래서 질문은 어떤 출력이 필요한가, until아니면 and MATCH2_TEXT until? MATCH3_TEXT의 중복 복사본에도 비슷한 문제가 적용됩니다. 이는 약간 더 복잡한 sed 프로그램으로 처리할 수 있습니다. 예를 들어 가장 긴 문자열을 유지합니다.

sed -n '/MATCH1_TEXT/!d;/MATCH2_TEXT.*MATCH3_TEXT/!d;s/MATCH2_TEXT/\n/;s/^.*\n\(.*\)MATCH3_TEXT.*$/\1/p'

먼저 부적절한 줄을 거부한 다음 MATCH2_TEXT의 첫 번째 항목을 줄 바꿈으로 변경한 다음(줄에 줄 바꿈이 없음) 줄 바꿈과 MATCH3_TEXT 사이의 텍스트를 선택하는 방식으로 작동합니다.

일부 언어(예: perl및 )는 python정규식에서 사용할 수 있는 작업을 확장하여 "최소 일치"를 허용합니다. 이는 이러한 경우에 도움이 될 수 있지만 필수는 아닙니다. sed조건부 반복 기능은 정규식보다 강력합니다.

답변2

"추출"이라는 단어를 볼 때마다 가장 먼저 떠오르는 것은 여기서 grep이 도움이 될 수 있습니까?입니다.

여기서는 먼저 관련 줄을 grep하고 다른 grep에 공급한 다음 match2와 match3 텍스트 사이에 있는 텍스트를 추출합니다. 이것은 연속적으로 여러 개의 match2/3을 추출합니다.

$ grep MATCH1_TEXT file |\
  grep -oP '(?<=MATCH2_TEXT).*?(?=MATCH3_TEXT)' 

답변3

실제로 필요한 것이 무엇인지 판단하기에는 샘플 데이터가 충분하지 않지만 샘플이 충분히 표준적이라고 가정하면

  1. MATCH1_TEXT, MATCH2_TEXT, 및 MATCH3_TEXT모두 한 줄에 있습니다.
  2. MATCH1_TEXT항상 앞에MATCH2_TEXT
  3. MATCHn_TEXT내부와 일치할 수 있음THEMATCHn_TEXTS

perl그런 다음 GNU에 대한 단일 호출을 사용하여 grep필요한 데이터를 추출 할 수 있습니다.

grep -oP 'MATCH1_TEXT.*?MATCH2_TEXT\K.*?(?=MATCH3_TEXT)'

예제 데이터 행의 경우 출력은 until(선행 및 후행 공백이 하나 있음)입니다.

관련 정보