如何解决如何使用sed或awk替换特定的xml节点值
我想使用sed
或awk
替换特定的xml节点值。我不能使用专门的软件包来解析xml,例如 xmlstarlet
,xmllint
等。我必须使用 sed
或awk
,只是“基本” shell。
我有很多大的xml文件。在该文件中,我要定位并替换两个标签值:示例:
<desc:partNumber>>2</desc:partNumber>
<desc:dateIssued>>1870</desc:dateIssued>
问题是,有数百个带有这些名称的标签。但是,这两个标记具有在整个xml文件中唯一的父标记:
<desc:desc ID="DESC_VOLUME_0001">
另一个问题是,父级 <desc:partNumber>
中的标签<desc:dateIssued>
和<desc:desc ID="DESC_VOLUME_0001">
的位置或行号在中不同每个文件。
我认为解决方案是:
- 定位父
<desc:desc ID="DESC_VOLUME_0001">
及其子对象并将其提取为变量 - 对孩子进行迭代并获得
<desc:partNumber>
的位置(行号) 和<desc:dateIssued>
并保存到变量 - 将行号传递给
sed
命令并替换当前值 具有新值的标签(将从 .csv 文件中读取新值)
我尝试创建此sed
命令,您可以看到我使用'n
'在行上移动,但这必须是可变的。
sed -i '/desc:desc ID="DESC_VOLUME_0001"/{n;n;n;n;n;n;n;n;n;s/'"${OLD_DATE_ISSUED}"'/'"${NEW_DATE_ISSUED}"'/}'
带孩子的父节点:
<desc:desc ID="DESC_VOLUME_0001">
<desc:physicalDescription>
<desc:note>text</desc:note>
</desc:physicalDescription>
<desc:titleInfo>
<desc:partNumber>2</desc:partNumber>
</desc:titleInfo>
<desc:originInfo>
<desc:dateIssued>1870</desc:dateIssued>
</desc:originInfo>
<desc:identifier type="uuid">81e32d30-6388-11e6-8336-005056827e52</desc:identifier>
</desc:desc>
有人可以帮助实现这一目标吗?
解决方法
在xmldata文件中带有示例数据:
awk -v dID="DESC_VOLUME_0001" -v part="5" -v dissue=1850 -F[\<\>]
'$2 ~ /desc ID/ {
split($2,arr,"\"");
descID=arr[2]
}
$2 ~ /desc:partNumber/ {
if (descID==dID) {
$0=gensub($3,part,$0)
}
}
$2 ~ /desc:dateIssued/ {
if (descID==dID)
{
$0=gensub($3,dissue,$0)
}
}
1' xmldata
一个班轮:
awk -v dID="DESC_VOLUME_0001" -v part="5" -v dissue=1850 -F[\<\>] '$2 ~ /desc ID/ { split($2,"\"");descID=arr[2] } $2 ~ /desc:partNumber/ { if (descID==dID) { $0=gensub($3,$0) } } $2 ~ /desc:dateIssued/ { if (descID==dID) { $0=gensub($3,$0) } }1' xmldata
在这里,将定界符设置为,还将dID设置为要搜索的desc ID,将要更改的partNumber一部分分配给要更改的日期。
然后,我们在该行中搜索desc ID文本,并基于双引号将其拆分,以获取数组arr的第二个索引,然后将其用于创建变量descID。
我们进一步搜索partNumber和dateIssued,检查是否dID = descID。如果它们匹配,我们使用gensub函数用传递的变量替换$ 0行中的第三个定界字段,并将结果设置为$ 0。我们最终通过1打印行(更改或其他方式)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。