![쉘 스크립트를 사용하여 XML 파일의 앰퍼샌드 문제 처리](https://linux55.com/image/12318/%EC%89%98%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20XML%20%ED%8C%8C%EC%9D%BC%EC%9D%98%20%EC%95%B0%ED%8D%BC%EC%83%8C%EB%93%9C%20%EB%AC%B8%EC%A0%9C%20%EC%B2%98%EB%A6%AC.png)
다음 내용이 포함된 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에서 앰퍼샌드를 나타내려면 엔터티를 사용해야 합니다. &
일반 앰퍼샌드를 나타내는 데 사용하십시오.
\&
이들을 합친다는 것은 대체 텍스트 에 sed
일반 앰퍼샌드를 사용하여 삽입 해야 함을 의미합니다 .
편집하다:
NAME=
코드의 줄을 다음과 같이 변경합니다.
NAME="`echo "$line" | awk '{$1=""; print}' | sed 's/&/\\\\&/g'`"
백슬래시는 두 번 삽입해야 합니다. 한 번은 할당에서 이스케이프하고 sed
, 한 번은 셸에서 이스케이프해야 합니다 NAME=
.
그러면 당신이 원하는 대로 될 것입니다.
Archemar가 언급했듯이 입력 형식이 변경되지 않거나 입력 기호 sed
보다 작거나 큰 기호가 없는 한 XML 등을 조작하는 것은 까다로울 수 있습니다.<
>