다음에 대한 제안사항이 있으면 감사하겠습니다.
수천 개의 .xml 파일이 포함된 "ABC"라는 폴더가 있습니다. XML의 핵심 구조는 동일합니다.
<product abcd…>
<category>
...
</category>
</product>
일부 xml 파일은 다음과 같이 생각할 수 있습니다.효과적인필수 태그가 포함되어 있기 때문에 <category>
) 그 중 일부는유효하지 않은필수 <category>
태그가 완전히 누락되었기 때문입니다. 닫히지도 않아</category>
따라서 목표는 </category>
"ABC" 폴더에 있는 XML에 태그가 없는 "잘못된" xml을 터미널을 통해 찾는 것입니다.
어떤 기회?
답변1
모든 XML 파일의 형식이 올바르다고 가정하고 : 를 사용하면 xmlstarlet
다음은 일치하는 모든 파일의 입력 파일 이름을 인쇄합니다.아니요아래 에 직계 하위 category
노드가 있습니다 product
.
xmlstarlet sel -t --if '/product/category' --else -f -nl ABC/*.xml
category
어디에도 노드가 없는 파일 만 검색하려는 경우 :
xmlstarlet sel -t --if '//category' --else -f -nl ABC/*.xml
두 명령 모두에서 xmlstarlet
지정된 XPath 표현식이 평가됩니다. 표현식이 발견된 하나 이상의 노드 집합으로 평가되는 경우 --if
테스트는 다음과 같습니다.진짜다른 일은 일어나지 않습니다. 그렇지 않으면 --else
분기가 평가되어 -f -nl
현재 파일 이름이 후행 줄 바꿈과 함께 출력됩니다.
노드가 누락된 파일에 대해 일부 작업을 수행한다고 가정하면 category
다음은 관련 파일을 처리할 수 있는 루프를 설정합니다.
for xml in ABC/*.xml; do
if ! xmlstarlet sel -t --if '/product/category' -nl "$xml" >/dev/null
then
# process "$xml" here
fi
done
macOS에서의 설치는 xmlstarlet
Homebrew를 통해 수행하는 것이 가장 좋습니다. Homebrew 패키지를 호출 xmlstarlet
하면 xml
.xmlstarlet
답변2
다음과 같은 작업이 수행됩니다.
grep -vl '</category>' ABC/*
열린 태그가 없는 파일도 보려면 다음을 시도해 보세요.
grep -vl 'category>' ABC/*