シェルスクリプトを使用した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'`"

バックスラッシュは2回挿入する必要があります。一度は割り当てからエスケープしsed、一度はシェルからエスケープする必要がありますNAME=

それからあなたが望むようになります。

Archemarが述べたように、入力形式が変更されていないか、入力シンボルsedよりも小さいか大きいシンボルがない限り、XMLなどを操作するのは難しいかもしれません。<>

おすすめ記事