XML 컨텍스트 grep

XML 컨텍스트 grep

아래는 내 파일의 내용입니다.

<A>
<number>100</number>
<name>Word1</name>
</A>
<A>
<number>101</number>
<name> Word2</name>
</A>

grep을 실행하면 Word1다음 출력을 보려고 합니다.

<A>
<number>100</number>
<name>Word1</name>
</A>

grep을 실행하면 Word2다음 출력을 보려고 합니다.

<A>
<number>101</number>
<name>Word2</name>
</A>

누구든지 도와줄 수 있나요?

답변1

이것이 올바른 형식의 XML 문서의 일부인 경우 XML 파서를 사용하여 필요한 부분을 추출할 수 있습니다.

만족시키다잘 구조화됨필수입니다. <root>XML 조각을 및 으로 래핑 했습니다 </root>.

xmlstarlet sel -t -c '//A[name="Word1"]' -n file.xml

이를 직접적으로 만족시킬 수 없다면 명시적으로 래핑할 수 있습니다.

( echo '<root>'; cat file.xml; echo '</root>' ) | xmlstarlet sel -t -c '//A[name="Word1"]' -n

두 경우 모두 출력은 다음과 같습니다.

<A>
<number>100</number>
<name>Word1</name>
</A>

답변2

그리고 pcregrep:

<file.xml pcregrep -Mo '(?s)<A>(?:.(?!</A>))*Word1.*?</A>'

GNU 사용 grep:

<file.xml grep -zPo '(?s)<A>(?:.(?!</A>))*Word1.*?</A>' | tr '\0' '\n'

(이는 전체 파일이 메모리에 로드되고 NUL 바이트가 포함되어 있지 않다고 가정함을 의미하지만).

일부 PCRE 연산자:

  • (?s)개방형 s플래그( .짝수 줄 구분 기호와 일치)
  • .(?!</A>)의 시작 부분에 있지 않은 모든 문자 </A>.
  • .*?탐욕스럽지 않은 버전.*
  • (:...)그룹화만 하면 됩니다.

<![CDATA[</A>]]>Word2또는 와 같은 XML 파서가 필요한 표현식을 찾을 수 없거나 찾을 수 없는 것에 속습니다 <![CDATA[W]]>ord2>. &#87;ord2그러나 XML 파서에는 유효한 XML 입력이 필요하지만, 파일 전체를 읽어야 하는 최상위 요소에 포함하지 않는 한 예제에서는 그렇지 않습니다(그러나 다시 말하지만 이것은 일반적으로 사용하는 것입니다) 형식은 현재 작업 중이며 내용은 변경될 가능성이 높습니다(확장 <![CDATA및 일부 &...;시퀀스). Xpath 표현식을 Word1사용하면 주석, XML 태그 또는 속성을 포함하여 어디에서나 찾기가 어렵습니다 .

관련 정보