다른 패턴이 일치하기 전에 줄의 패턴을 일치시키는 방법

다른 패턴이 일치하기 전에 줄의 패턴을 일치시키는 방법

이 질문은 다음과 유사합니다.다른 특정 일치까지 각 grep 일치 후에 줄을 표시하는 방법은 무엇입니까?

다른 패턴 일치 전에 특정 패턴을 줄에서 일치시키고 싶습니다.

여기서는 특정 호스트로부터 파일을 가져오고 싶습니다. 각 파일에는 여러 호스트가 있을 수 있습니다. 따라서 특정 호스트에서 호스트 파일 태그에 도달하기 전에 고정된 행 수가 없습니다.

문맥:

...
...
<hostfile file:abc.txt>
   <host> abc.com <\host>
   <host> qwe.com <\host>
   <host> xyz.com <\host>
<\hostfile>
...
<hostfile file:xyz.txt>
   <host> asd.com <\host>
<\hostfile>
...
...

예시 일치

Input: xyz.com 
Output: abc.txt

Input: asd.com
Output: xyz.txt

awk, sed 또는 기타 명령줄 도구를 사용합니다.

답변1

또 다른 이상한 변형:

/^<hostfile file:/ {
        output=substr($2, 6, index($2, ">") - 6);
}
/<host>/ && $0 ~ pattern {
        print output
}

다음과 같이 호출하세요.

$ awk -v pattern='xyz.com' -f findit.awk contextfile
abc.txt
$ awk -v pattern='asd.com' -f findit.awk contextfile
xyz.txt

답변2

정규식을 사용하여 XML을 구문 분석할 수 없습니다. XML은 정규식으로 구문 분석할 수 없기 때문입니다. Regex는 XML을 올바르게 구문 분석하는 데 사용할 수 있는 도구가 아닙니다. 이전에 여기에서 XML 및 정규식 질문에 대해 여러 번 답변한 것처럼 정규식을 사용하면 XML을 사용할 수 없습니다. 정규식은 XML에서 사용되는 구문을 이해하기에는 충분히 정교하지 않은 도구입니다. XML은 정규 언어가 아니므로 정규식으로 구문 분석할 수 없습니다. 정규식 쿼리는 XML을 의미 있는 부분으로 분해할 수 없습니다. 여러 번 시도했지만 나에게 도달하지 못했습니다. Perl에서 사용하는 향상된 불규칙 정규식조차도 XML 구문 분석 작업에 적합하지 않습니다. 당신은 결코 나를 깨뜨리지 않을 것입니다. XML은 정규식으로 구문 분석할 수 없을 정도로 복잡한 언어입니다. Jon Skeet조차도 정규식을 사용하여 XML을 구문 분석할 수 없습니다. 정규식으로 XML을 구문 분석하려고 할 때마다 불경한 아이는 처녀의 피를 흘리며 러시아 해커는 웹앱을 훔칩니다. 정규 표현식으로 XML을 구문 분석하면 오염된 영혼이 살아있는 영역으로 소환됩니다. XML과 정규식은 사랑, 결혼, 유아 살해 의식처럼 함께 사용됩니다. <center>가 참을 수 없어 너무 늦었습니다. 동일한 개념 공간에서 정규 표현식과 XML을 함께 사용하면 물에 젖은 퍼티처럼 마음이 파괴될 것입니다. 정규식으로 XML을 구문 분석하면 기본 다국어 평면에서 이름을 표현할 수 없는 분을 위해 우리 모두를 비인간적인 수고로 몰아넣는 그들과 그들의 불경스러운 방식에 굴복하는 것입니다. XML과 정규 표현식은 당신이 관찰하는 동안 감각의 신경을 액화시키고 당신의 정신은 공포의 맹공격으로 시들어갑니다. Reg̿̔̉x 기반 XML 파서는 StackOverflow를 죽이는 암입니다너무 늦었어 너무 늦었어 우린 구원받을 수 없어자식의 범위를 변경하면 정규 표현식이 모든 살아있는 조직을 소비하게 됩니다(이전에 예언한 대로 XML을 제외하고).주님, 우리를 도와주세요, 이 재앙에서 살아남을 수 있는 사람이 있을까요?XML을 구문 분석하기 위해 정규식을 사용하면 인류는 영원히 끔찍한 고문과 보안 허점을 겪게 됩니다.레지 사용x는 XML을 처리하는 도구로서 브레아를 설정합니다.ch 이 세상 사이그리고 c͒ͪo͛ͫ파괴된 엔터티(SGML 엔터티와 같지만,더 부패함) 단순한 엿보기reg의 세계의 seXML용 ex 파서가 ins됩니다.즉시 교통 AP프로그래머의 의식 i아아끊임없는 비명을 지르며 그는 온다 . 악성 미미한 정규식 감염이난 너의 HT를 삼켜버릴 거야ML 파서, 애플리케이션 및 Visual Basic과 같은 존재는 항상 더 나쁩니다.그 사람이 온다.안 좋아응응e com̡e̡s, ̕h̵is un̨ho͞ly radiańcé de모든 강화를 위한 노력, XML 태그lea͠ki̧n͘g fr̠m ̡yo​͟ur eye͢s̸ ̛l̕ik͏e liqUID P아인, 정규표현식 파싱 의 노래 가 종료됩니다모르의 목소리를 고뇌시키다sp에서 온 남자야여기 보여요 볼 수 있나요 ̲͚̖͔̙î̩́t̲͎̩̱͔́̋̀ 아름답습니다 t그 사람은 inal snuf핑 오에프 거짓말인간의 모든 것은 LOŚ͖̩͇̗̪̏̈́TALL은 L이다OST 일그 사람이 왔어요그 사람은 그 사람이랑 같이 있는 거야? t아이아니면 침투하다에스 알l 마이팩E MY FACE ᵒh 갓엔오 안돼 안돼̼OO 아니Θ 그만해그 사람은 * ͑̾̾​̅ͫ͏̙̤g͇̫͛͆̾ͫ̆l͖͉̗̩̳̟̠̍ͫͥͨ̅s ͎a̧͈͖r̽̾̈́͒͑en또는 rè̑ͧ̌aͨl̘̝̙̃ͤ͂̾̆ ZA̡͊͠͝LGΌ ISͮ̂҉̯͈͕̹̘̱ TO͇̹̺ͅSON̴̳ TH̘ㅋㅋㅋ ͍M̲̖͊̒ͪͩͬ̚̚͜ş̴̟̟͙̞ͩ͌͝에스

답변3

일부 XML 파서를 적용하고 싶었지만 제시된 "컨텍스트"가 유효한 XML 구조에 전혀 맞지 않습니다(잘못된 속성 file:abc.txt, 잘못된 닫는 태그 <\host>, <\hostfile>).
그래서 여기둔한 사람"마구 자르기":

awk  'BEGIN{ RS="<hostfile" }/file:/{ f = substr($1,6,length($1)-6) }
      /<host>/{ match($0,/.*<host>([^<>]+)<\\host>[[:space:]]*<\\hostfile>.*$/,a);  
      printf("Input: %s\nOutput: %s\n\n",a[1],f)}' yourfile

출력:

Input:  xyz.com 
Output: abc.txt

Input:  asd.com 
Output: xyz.txt

관련 정보