XML 컨텍스트 수집

XML 컨텍스트 수집

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

<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>.
  • .*?탐욕스럽지 않은 버전.*
  • (:...)그냥 그룹화.

XML 파서가 필요한 표현을 <![CDATA[</A>]]>찾거나 찾지 못하는 것과 같은 것에 속습니다 . 그러나 XML 파서에는 샘플을 최상위 요소에 포함하지 않는 한 샘플이 아닌 유효한 XML 입력이 필요하며 파일 전체를 읽어야 합니다(하지만 일반적으로 해당 형식으로 작업할 때 이는 귀하의 몫입니다). 잠재적으로 콘텐츠를 변형합니다( 및 일부 시퀀스 확장). 그리고 xpath 표현식을 사용하면 주석이나 XML 태그 또는 속성을 포함하여 어디에서나 해당 항목을 찾기가 어렵습니다 .Word2<![CDATA[W]]>ord2>&#87;ord2<![CDATA&...;Word1

관련 정보