쉘 스크립트를 사용하여 XML 파일의 앰퍼샌드 문제 처리

쉘 스크립트를 사용하여 XML 파일의 앰퍼샌드 문제 처리

다음 내용이 포함된 xml 파일이 있습니다.

<SummaryRecordMapping>
<eName>Licensed Original MC TPE EXCESSIVE AUTH</eName>
<jobs>
<job>

<SummaryRecordMapping>
<eName>Licensed Reversal MC TPE EXCESSIVE AUTH</eName>
<jobs>
<job>

그 중 라이선스된 독창성과 라이선스된 반전은 정적입니다.

나는 다음과 같은 출력을 원한다

<SummaryRecordMapping>
<eName>Licensed Original PCI & Liability Waiver</eName>
<jobs>
<job>

<SummaryRecordMapping>
<eName>Licensed Reversal PCI & Liability Waiver</eName>
<jobs>
<job>

<SummaryRecordMapping>
<eName>Licensed Original PCI & Liability Waiver</eName>
<jobs>
<job>

<SummaryRecordMapping>
<eName>Licensed Reversal PCI & Liability Waiver</eName>
<jobs>
<job>

하지만 코드를 실행하면 아래 출력이 표시됩니다.

<SummaryRecordMapping>
<eName>Licensed Original PCI <eName>Licensed Original MC TPE EXCESSIVE AUTH</eName> Liability Waiver</eName>
<jobs>
<job>

<SummaryRecordMapping>
<eName>Licensed Reversal PCI <eName>Licensed Reversal MC TPE EXCESSIVE AUTH</eName> Liability Waiver</eName>
<jobs>
<job>
<SummaryRecordMapping>
<eName>Licensed Original PCI <eName>Licensed Original MC TPE EXCESSIVE AUTH</eName> Liability Waiver</eName>
<jobs>
<job>

<SummaryRecordMapping>
<eName>Licensed Reversal PCI <eName>Licensed Reversal MC TPE EXCESSIVE AUTH</eName> Liability Waiver</eName>
<jobs>
<job>

아래는 내 코드입니다

#!/usr/bin/bash

while IFS= read -r line; do
    NAME="`echo "$line" | awk '{$1=""; print}'`"
    sed "s#^<eName>Licensed Original.*</eName>#<eName>Licensed Original$NAME</eName>#;s#^<eName>Licensed Reversal.*</eName>#<eName>Licensed Reversal$NAME</eName>#" LO.xml >> LR.xml
done < input.txt

누구든지 코드에 어떤 문제가 있는지 말해 줄 수 있나요?

답변1

교체 시 sed& 기호는 교체할 일치하는 텍스트를 나타냅니다.

리터럴 앰퍼샌드를 삽입하려면 백슬래시를 사용하여 앰퍼샌드를 이스케이프 처리해야 합니다.\&

이 질문 외에도 XML에서 앰퍼샌드를 나타내려면 엔터티를 사용해야 합니다. &amp;일반 앰퍼샌드를 나타내는 데 사용하십시오.

\&amp;이들을 합친다는 것은 대체 텍스트 에 sed일반 앰퍼샌드를 사용하여 삽입 해야 함을 의미합니다 .

편집하다:

NAME=코드의 줄을 다음과 같이 변경합니다.

NAME="`echo "$line" | awk '{$1=""; print}' | sed 's/&/\\\\&amp;/g'`"

백슬래시는 두 번 삽입해야 합니다. 한 번은 할당에서 이스케이프하고 sed, 한 번은 셸에서 이스케이프해야 합니다 NAME=.

그러면 당신이 원하는 대로 될 것입니다.

Archemar가 언급했듯이 입력 형식이 변경되지 않거나 입력 기호 sed보다 작거나 큰 기호가 없는 한 XML 등을 조작하는 것은 까다로울 수 있습니다.<>

관련 정보