合并xml元素属性

合并xml元素属性,xml,xml-parsing,xmlstarlet,Xml,Xml Parsing,Xmlstarlet,我有一个输入xml <IndexCatalogueRecord SeriesNumber="1" SeriesVolume="3" SeriesPage="594"> <IndexCatalogueID>10305941390</IndexCatalogueID> <GeneralNote>[Shelved in: B.58]</GeneralNote> <GeneralNote>[Shelved in: B.458]<

我有一个输入xml

<IndexCatalogueRecord SeriesNumber="1" SeriesVolume="3" SeriesPage="594">
<IndexCatalogueID>10305941390</IndexCatalogueID>
<GeneralNote>[Shelved in: B.58]</GeneralNote>
<GeneralNote>[Shelved in: B.458]</GeneralNote>
<GeneralNote>[Shelved in: B.20]</GeneralNote>
<Language>fr</Language>
</IndexCatalogueRecord>

但是,当我试图通过管道将控制台输出传输到grep,让它剥离匹配字符串“[搁置在:”和“]”时,我遇到了一些问题,请告诉我是否有更优雅的解决方案。提前感谢

一种可能的方法是使用两个嵌套的
xmlstarlet
命令
(注意表达式中出现的两个文件名):

内部
xmlstarlet
命令从所有
GeneralNote
元素创建最终值,外部命令更新第一个
GeneralNote
元素并删除另一个元素。在xmlstarlet中,
ed
是编辑值模式,
sel
是选择值模式

  • -u
    -表示更新值
  • -v
    -通过XPath检索值
  • -m
    -迭代匹配XPath表达式的所有节点
  • -o
    -输出一个静态字符串
  • -b
    -结束迭代或if子句
  • -d
    -删除与XPath匹配的所有节点
如果要就地修改XML,请在
xmlstarlet ed
后面添加一个
-L
选项

<IndexCatalogueRecord SeriesNumber="1" SeriesVolume="3" SeriesPage="594">
<IndexCatalogueID>10305941390</IndexCatalogueID>
<GeneralNote>[Shelved in: B.58, B.458, B.20]</GeneralNote>
<Language>fr</Language>
</IndexCatalogueRecord>
 xmlstarlet sel -t -m "//GeneralNote" -v . -n test.xml
xmlstarlet ed -u "/IndexCatalogueRecord/GeneralNote[1]" \
  -v "$(xmlstarlet sel -t -o "[Shelved in: " -m "/IndexCatalogueRecord/GeneralNote" \
  -v "substring-after(substring-before(.,']'),'[Shelved in: ')" \
  --if 'position() != last()' -o ', ' -b -b -o "]" input.xml)" \
  -d "/IndexCatalogueRecord/GeneralNote[position() > 1]" input.xml