다음과 같이 sed 패턴 검색이 있습니다.
sed -n '/<centerline/,/<\/centerline/p'
<centerline>
그러면 와 사이의 모든 내용이 검색됩니다 .</centerline>
<centerline id ="sid*" >
다음을 닫기 전에 모든 것을 무시하고 싶습니다.</centerline>
기본적으로 중심선이 sid인 경우를 제외한 모든 중심선을 포함시키고 싶습니다. 아래에 제공된 일부 스니펫이 포함되어 있습니다.
<centerline id ="star12L" >
<polyline>
<point x="487610.06" y="2803975.46" />
<point x="501348.98" y="2795594.35" />
</polyline>
</centerline>
제외하다:
<centerline id ="sid12L" >
<polyline>
<point x="501348.98" y="2795594.35" />
<point x="487610.06" y="2803975.46" />
</polyline>
</centerline>
어떻게 해야 하나요?
감사해요!
답변1
XML 파일이 다음과 같다고 가정합니다.
<?xml version="1.0"?>
<root>
<centerline id="star12L">
<polyline>
<point x="487610.06" y="2803975.46"/>
<point x="501348.98" y="2795594.35"/>
</polyline>
</centerline>
<centerline id="sid12L">
<polyline>
<point x="501348.98" y="2795594.35"/>
<point x="487610.06" y="2803975.46"/>
</polyline>
</centerline>
<centerline id="star12R">
<polyline>
<point x="487610.06" y="2803975.46"/>
<point x="501348.98" y="2795594.35"/>
</polyline>
</centerline>
</root>
XML 스타문자열로 시작하는 속성이 centerline
없는 두 개의 노드를 구문 분석할 수 있습니다 .id
sid
$ xmlstarlet sel -t -c '//centerline[starts-with(@id,"sid") = false]' -nl file.xml
<centerline id="star12L">
<polyline>
<point x="487610.06" y="2803975.46"/>
<point x="501348.98" y="2795594.35"/>
</polyline>
</centerline><centerline id="star12R">
<polyline>
<point x="487610.06" y="2803975.46"/>
<point x="501348.98" y="2795594.35"/>
</polyline>
</centerline>
이것X 경로쿼리는 //centerline[starts-with(@id,"sid") = false]
" 문자열로 시작하지 않는 문서의 centerline
모든 속성과 일치"를 의미합니다. 명령줄 에서 쿼리와 일치하는 노드의 복사본을 요청합니다.id
sid
-c
xmlstarlet
xmlstarlet
태그 사이에서 콘텐츠를 추출하는 것보다 이것이 약간 더 강력하다는 것을 보여주기 위해 :
x
이러한 구조의 노드 합계를 얻으려면 (적절한 접두사 포함):y
point
centerline
centerline
id
$ xmlstarlet sel -t -m '//centerline[starts-with(@id,"sid") = false]/polyline/point' \
-v 'concat(../../@id, ":", @x, ",", @y)' -nl file.xml
star12L:487610.06,2803975.46
star12L:501348.98,2795594.35
star12R:487610.06,2803975.46
star12R:501348.98,2795594.35
브랜드 -m
만xmlstarlet
성냥노드( polyline/point
제외되지 않은 노드 centerline
아래의 노드 )가 주어지면 다음 -v
쿼리는 로 구성된 값을 가져옵니다 concat()
. 일치하는 각 노드에 대해 얻고자 하는 문자열을 연결 concat()
("결합") 합니다 point
( 노드 의 속성 ../../@id
참조 ).id
centerline