다음과 같은 줄을 상상해 보세요.
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
실제로 필요한 것이 무엇인지 판단하기에는 샘플 데이터가 충분하지 않지만 샘플이 충분히 표준적이라고 가정하면
MATCH1_TEXT
,MATCH2_TEXT
, 및MATCH3_TEXT
모두 한 줄에 있습니다.MATCH1_TEXT
항상 앞에MATCH2_TEXT
MATCHn_TEXT
내부와 일치할 수 있음THEMATCHn_TEXTS
perl
그런 다음 GNU에 대한 단일 호출을 사용하여 grep
필요한 데이터를 추출 할 수 있습니다.
grep -oP 'MATCH1_TEXT.*?MATCH2_TEXT\K.*?(?=MATCH3_TEXT)'
예제 데이터 행의 경우 출력은 until
(선행 및 후행 공백이 하나 있음)입니다.