sed - 다른 패턴 사이에서 발견된 것을 제외하고 두 패턴 사이에서 발견된 모든 것을 포함합니다.

sed - 다른 패턴 사이에서 발견된 것을 제외하고 두 패턴 사이에서 발견된 모든 것을 포함합니다.

다음과 같이 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없는 두 개의 노드를 구문 분석할 수 있습니다 .idsid

$ 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모든 속성과 일치"를 의미합니다. 명령줄 에서 쿼리와 일치하는 노드의 복사본을 요청합니다.idsid-cxmlstarlet


xmlstarlet태그 사이에서 콘텐츠를 추출하는 것보다 이것이 약간 더 강력하다는 것을 보여주기 위해 :

x이러한 구조의 노드 합계를 얻으려면 (적절한 접두사 포함):ypointcenterlinecenterline 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

브랜드 -mxmlstarlet성냥노드( polyline/point제외되지 않은 노드 centerline아래의 노드 )가 주어지면 다음 -v쿼리는 로 구성된 값을 가져옵니다 concat(). 일치하는 각 노드에 대해 얻고자 하는 문자열을 연결 concat()("결합") 합니다 point( 노드 의 속성 ../../@id참조 ).idcenterline

관련 정보