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