저는 XML 파일을 처리하고 있는데 각 파일의 길이는 수십 줄입니다. 문자 그대로 수백 개의 파일이 디렉터리 구조에 분산되어 있습니다. 네, 마젠토입니다.
이 요소가 포함된 파일을 찾아야 합니다 <foo><bar><boom><bang>
. 태그 <boom><bang>
는 다른 태그 아래에 정의될 수 있으므로전체 경로를 검색해야 합니다.단지 닫는 태그나 태그가 아닙니다. 각 태그 사이에는 수십 개의 줄이 있을 수 있으며, 그 사이에는 다른 태그가 있습니다.
<foo>
<hello_world>
... 50 lines ....
</hello_world>
<bar>
<giraffe>
... 50 lines ....
</giraffe>
<boom>
<bang>Vital information here</bang>
</boom>
</bar>
</foo>
정의된 파일을 검색하는 우아한 *nix 방법은 무엇입니까 <foo><bar><boom><bang>
?저는 현재 최신 데비안 파생 배포판을 사용하고 있습니다.
설득력과는 거리가 먼 현재 솔루션은 다음과 같습니다.
$ grep -rA 100 foo * | grep -A 100 bar | grep -A 100 boom | grep bang | grep -E 'foo|bar|boom|bang'
답변1
경로가 존재 하는지 xmlstarlet
시도한 다음 파일 이름을 출력 할 수 있습니다 .sel
i
f
find . -name '*.xml' -exec xmlstarlet sel -t -i '/foo/bar/boom/bang' -f -n {} +
답변2
xq
XML 파서 도구 사용yq
설치 패키지그리고 xq 출력을 기반으로 한 종료 상태가 0인 경우에만 파일 이름을 인쇄합니다.
find -type f -name '*.xml' -exec sh -c '
xq -e '.foo.bar.boom.bang' "$1" >/dev/null
' _ {} \; -print
-e는 출력에 따라 종료 상태 코드를 설정합니다.
man jq
이 옵션 에 대한 자세한 내용은 다음을 참조하세요.
-e / --exit-status:
마지막 출력 값이 false 또는 null이 아니면 jq의 종료 상태를 0으로 설정하고, 유효한 출력이 생성되지 않으면 1로 설정합니다. 결과적으로 4로 설정되었습니다. 일반적으로 jq는 사용 문제나 시스템 오류가 있으면 2로 종료되고, jq 프로그램 컴파일 오류가 있으면 3으로 종료되고, jq 프로그램이 실행 중이면 0으로 종료됩니다.