이 질문은 다음과 유사합니다.다른 특정 일치까지 각 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
또 다른 awk 변형:
/^<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 처리 도구로서 획기적인 발전을 이루었습니다.이 세계 사이의 chc ͒ ͪo ͛ 인터럽트 엔티티(SGML 엔티티와 같지만,더 부패함) 그냥 한눈에등록 세계의 SEXML ex 파서가 삽입합니다.탄틀리 트랜스포트 컴퍼니프로그래머 인식 i엔토또는계속 비명을 지르세요. 그가 옵니다 . 치명적이고 교활한 정규식 감염은나는 너의 HT를 삼켜버린다ML 파서, 앱은 Visual Basic과 마찬가지로 항상 존재했지만 더 나빴습니다.그 사람이 온다 그 사람이 온다영어허용되지 않음옳은e com̡e̡s, ̕h̵is un̨ho͞ly radiańcé de모든 enli̍̈́̂̈́ 제한 사항, XML 태그 분석lea͠ki̧n͘g fr̠m ̡yo͟너의 눈͢s̸ ̛l̕ik͏e liquidp아인, 정규식 파싱 의 노래 가 끝나갑니다고민하는 몰의 목소리sp의 탈만여기서도 보이고 ̲͚̖͔̙î̩́t̲͎̩̱͔́̋̀ 아름답습니다 t헤 inal snuf
페나오거짓말하다남자의 모든 것은 LOŚ͖̩͇̗̪̏̈́T ALL은 L이다OST그는 온그녀는 여기 에 왔어그래요그무형유산또는 침투ar마이팩E MY FACE ᵒh 하느님 n오 안돼 안돼̼오른θ 중지 t그는 * ͑̾̾̅ͫ͏̙̤g͇̫͛͆̾ͫ̆l͖͉̗̩̳̟̠̍ͫͥͨ̅s ͎a̧͈͖r̽̾̈́͒͑e
not rè̑ͧ̌aͨl̘̝̙ͤ͂̾̆ ZA̡͊͠͝LGΌ ISͮ̂Љ̯͈͕̹̘̱ TO͇̹̺ͅ松̴ş̳ 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