我有一个 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
,另一次是为了从 shell 中转义NAME=
。
那应该做你想做的事。
请注意,正如Archemar所评论的,使用等操作XML可能会很棘手,除非您确定输入不会改变格式,输入中sed
没有任何小于<
或大于符号等。>