Deb*_*tta 3 xml shell-script text-processing
一旦sed在 Linux 上使用的 XML 中存在部分匹配,我需要使用固定值更新 XML 中的变量值。
例子:
输入值:
<Table tableName="Data" primaryKey="PGPU_ID=1234" DBaction="A" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.02,6.03,6.04">
Run Code Online (Sandbox Code Playgroud)
要求是只要版本值中有“6.02”,就只用 6.02 更新版本值。所以,输出会是这样的:
<Table tableName="Data" primaryKey="PGPU_ID=1234" DBaction="A" version="6.02">
Run Code Online (Sandbox Code Playgroud)
注:tableName="Data"是固定值,但是PGPU_ID,DBaction并且version可以是不同的。所以每当tablename ="Data"和version是6.02,那么sed命令应该只有6.02保持其他值完全相同的替代版本。
使用xmlstarlet:
xmlstarlet ed -u '//Table/@version[ ../@tableName = "Data" and contains(.,"6.02") ]' -v '6.02' file.xml
Run Code Online (Sandbox Code Playgroud)
这将找到version每个Table节点的所有属性。它选择属于Table节点的节点,这些节点也具有tableName带有值的属性Data 并包含子字符串6.02。这些仅更新为 string 6.02。
结果被写入标准输出,您可以将其重定向到一个新文件,或者您可以用来xmlstarlet ed --inplace -u ...就地编辑文档(小心使用)。