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로 구분되어야 합니다( -Z
GNU grep
또는 호환 옵션 사용).
grep -rlZ "needed_text" . |
xargs -r0 pcregrep -Mo '(?s)<xmltag>.*?</xmltag>'
<xmltag>
(중첩된 s 가 없고 <xmltag>
s가 CDATA에 나타나지 않는다고 가정하고 정규식을 사용하여 XML을 구문 분석하는 것과 관련된 일반적인 주의 사항).
파일이 적절한 XML 파일인 경우 대신 , xmllint
와 같은 XML 인식 도구를 사용하여 필요한 태그를 추출할 수 있습니다.xpath
xmlstarlet
pcregrep
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
.)