sed를 사용하여 XML 파일에서 여러 문자열 검색

sed를 사용하여 XML 파일에서 여러 문자열 검색

대용량 파일 XML을 필터링하고 여러 기준을 사용하여 문자열을 찾아야 합니다. cnisfCF가 true이고 natg_passwordAlreadyResetedPostMigration이 true인 경우 이메일을 필터링해야 합니다.

누구든지 도와줄 수 있나요?

<customer customer-no="09090909090">
        <credentials>
            <login>[email protected]</login>
            <enabled-flag>true</enabled-flag>
            <password-question/>
            <password-answer/>
        </credentials>
        <profile>
            <salutation/>
            <title/>
            <first-name>teste</first-name>
            <second-name/>
            <last-name>name 1</last-name>
            <suffix/>
            <company-name/>
            <job-title/>
            <email>[email protected]</email>
            <phone-home>542926407485</phone-home>
            <phone-business/>
            <phone-mobile/>
            <fax/>
            <birthday>1999-09-12Z</birthday>
            <gender>2</gender>
            <creation-date>2022-09-19T18:34:45.000Z</creation-date>
            <preferred-locale/>
            <custom-attributes>
                <custom-attribute attribute-id="natg_Newsletter">false</custom-attribute>
                <custom-attribute attribute-id="natg_cfIsCn">false</custom-attribute>
                <custom-attribute attribute-id="natg_cpf">5465465456456</custom-attribute>
                <custom-attribute attribute-id="natg_infContOptIn">false</custom-attribute>
                <custom-attribute attribute-id="natg_optInWP">false</custom-attribute>
                <custom-attribute attribute-id="natg_passwordAlreadyResetedPostMigration">true</custom-attribute>
                <custom-attribute attribute-id="natg_personNumber">116864397</custom-attribute>
                <custom-attribute attribute-id="natg_pushOptIn">false</custom-attribute>
                <custom-attribute attribute-id="natg_rut">456456456</custom-attribute>
            </custom-attributes>
        </profile>

답변1

다음 명령을 테스트 실행하기 전에 </customer>누락된 닫는 태그를 데이터에 자유롭게 추가 했습니다. cnisfCF이것이 귀하의 경우라고 가정합니다 natg_cfIsCn(속성 및 노드 이름은 대소문자를 구분합니다).


사용 xmlastarlet:

xmlstarlet select --template \
    --match '//profile' \
    --match 'self::node()[custom-attributes/custom-attribute[@attribute-id="natg_cfIsCn"]="true"]' \
    --match 'self::node()[custom-attributes/custom-attribute[@attribute-id="natg_passwordAlreadyResetedPostMigration"]="true"]' \
    --value-of 'email' -nl file.xml

위 명령은 email속성 합계가 있는 입력 문서의 모든 노드와 값 합계의 하위 노드에서 노드 값을 추출합니다.profilecustom-attributes/custom-attributeattribute-idnatg_cfIsCnnatg_passwordAlreadyResetedPostMigrationfalsetrue

여기서 까다로운 점은 경로에 포함된 노드 이름이 너무 길기 때문에 읽기 쉬운 방식으로 명령을 표시한다는 것입니다. 먼저 //profile경로를 일치시킨 다음 두 가지 개별 단계를 수행하여 결과 집합의 범위를 좁혀 이 문제를 해결했습니다 .

단일 "값" XPath 쿼리만 사용하는 select 문은 다음과 같습니다.

xmlstarlet select --template \
    --value-of '//profile[
        custom-attributes/custom-attribute[@attribute-id="natg_cfIsCn"]="true" and 
        custom-attributes/custom-attribute[@attribute-id="natg_passwordAlreadyResetedPostMigration"]="true"
    ]/email' -nl file.xml

이것이 더 예뻐 보인다면 대신 사용하세요. 나는 그들이 동등해야 한다고 믿습니다.

쿼리와 일치하는 데이터가 없기 때문에 위 명령은 지정된 문서에 대한 출력을 생성하지 않습니다.

관련 정보