다른 텍스트와 xml 태그의 조합, grep in grep이 포함된 파일의 내용을 찾으십니까?

다른 텍스트와 xml 태그의 조합, grep in grep이 포함된 파일의 내용을 찾으십니까?

grep 'xmltag'와 'subtag'가 일치하는 파일이 많이 있습니다.

random xml
needed_text
random xml
<xmltag>
<subtag>content</subtag>
</xmltag>

다른 텍스트 "needed_text"와 일치하는 파일을 검색하고 싶습니다.

출력에는 최소한 "content"가 포함되어야 하지만 완전한 줄도 허용됩니다.

<xmltag>
     <subtag>content</subtag>
</xmltag>

xmltag와 subtag는 같은 줄에 있을 수도 있고 다른 줄에 있을 수도 있습니다.

grep -rl "needed_text" * 

두 번째 부분으로 입력해야 하는 파일 이름 목록을 제공하지만 이를 다른 grep(또는 다른 명령)에 어떻게 제공하고 xmltag와 subtag의 조합만 찾도록 하려면 어떻게 해야 합니까?

답변1

파일 목록을 다른 명령에 전달하려면 를 사용할 수 있습니다 xargs. 이를 안정적으로 만들려면 -0대부분의 최신 구현에서 지원되는 옵션이 필요하며 파일 경로 목록은 NUL로 구분되어야 합니다( -ZGNU grep또는 호환 옵션 사용).

grep -rlZ "needed_text" . |
  xargs -r0 pcregrep -Mo '(?s)<xmltag>.*?</xmltag>'

<xmltag>(중첩된 s 가 없고 <xmltag>s가 CDATA에 나타나지 않는다고 가정하고 정규식을 사용하여 XML을 구문 분석하는 것과 관련된 일반적인 주의 사항).

파일이 적절한 XML 파일인 경우 대신 , xmllint와 같은 XML 인식 도구를 사용하여 필요한 태그를 추출할 수 있습니다.xpathxmlstarletpcregrep

grep -rlZ "needed_text" . |
  xargs -r0 xpath -e //xmltag

xmltag또는 적어도 하나의 s 에 대해서만 subtag:

grep -rlZ "needed_text" . |
  xargs -r0 xpath -e //xmltag/subtag/..

xpath(여기서 제공되는 Perl 모듈을 사용합니다 XML::XPath.)

관련 정보