次の内容を含む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'`"
バックスラッシュは2回挿入する必要があります。一度は割り当てからエスケープしsed
、一度はシェルからエスケープする必要がありますNAME=
。
それからあなたが望むようになります。
Archemarが述べたように、入力形式が変更されていないか、入力シンボルsed
よりも小さいか大きいシンボルがない限り、XMLなどを操作するのは難しいかもしれません。<
>