使用 shell 脚本处理 xml 文件中的 & 符号问题

使用 shell 脚本处理 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,另一次是为了从 shell 中转义NAME=

那应该做你想做的事。

请注意,正如Archemar所评论的,使用等操作XML可能会很棘手,除非您确定输入不会改变格式,输入中sed没有任何小于<或大于符号等。>

相关内容