我需要在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">
要求是每当版本值中存在“6.02”时,仅将版本值更新为 6.02。所以,输出会是这样的:
<Table tableName="Data" primaryKey="PGPU_ID=1234" DBaction="A" version="6.02">
注:tableName="Data"
是固定值,但PGPU_ID
、DBaction
和version
可以不同。因此,每当tablename ="Data"
和version
是 时6.02
,该sed
命令都应仅将版本替换为 6.02,保持其他值完全相同。
答案1
使用xmlstarlet
:
xmlstarlet ed -u '//Table/@version[ ../@tableName = "Data" and contains(.,"6.02") ]' -v '6.02' file.xml
这会找到version
每个节点的所有属性Table
。它选择属于Table
也具有tableName
该值的属性的节点Data
和包含子字符串6.02
.这些仅更新为字符串6.02
。
结果将写入标准输出,您可以在其中将其重定向到新文件,或者可以用于xmlstarlet ed --inplace -u ...
就地编辑文档(谨慎使用)。
答案2
免责声明:切勿自动更改 XML 文件 sed
除非你真的确定自己在做什么。通常很容易发明脚本失败的例子。在这种情况下, oldversion="..."
例如,会匹配。
sed 's/version="\([^",]*,\)*6.02\(,[^",]*\)*"/version="6.02"/g'
16.02
如果 是版本号或,则不需要替换6.021
,这使得创建模式有点难看。[^",]*,
匹配任何不带逗号或双引号的字符串,后跟一个逗号,因此\([^",]*,\)*
匹配零个或多个这些字段。这样我们就可以确保 之前没有数字或其他内容6.02
。版本号后面的字段也是如此。
答案3
将awk
工作?
awk '$2~/tableName="Data"/ && $5 ~ /[*",.^]6.02[$.,"*]/ { $5 = "version=\"6.02\">" }1'
- 输入
<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">
<Table tableName="Data" primaryKey="PGPU_ID=4284" DBaction="B" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.05,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=8827" DBaction="C" 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">
<Table tableName="Data" primaryKey="PGPU_ID=1234" DBaction="D" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.06,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=4284" DBaction="E" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.05,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=8827" DBaction="F" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.09,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=1234" DBaction="G" 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">
<Table tableName="Data" primaryKey="PGPU_ID=4284" DBaction="H" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.05,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=8827" DBaction="I" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.04,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=1234" DBaction="J" 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">
<Table tableName="Data" primaryKey="PGPU_ID=4284" DBaction="K" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.05,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=8827" DBaction="L" 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">
- 输出
<Table tableName="Data" primaryKey="PGPU_ID=1234" DBaction="A" version="6.02">
<Table tableName="Data" primaryKey="PGPU_ID=4284" DBaction="B" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.05,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=8827" DBaction="C" version="6.02">
<Table tableName="Data" primaryKey="PGPU_ID=1234" DBaction="D" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.06,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=4284" DBaction="E" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.05,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=8827" DBaction="F" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.09,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=1234" DBaction="G" version="6.02">
<Table tableName="Data" primaryKey="PGPU_ID=4284" DBaction="H" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.05,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=8827" DBaction="I" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.04,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=1234" DBaction="J" version="6.02">
<Table tableName="Data" primaryKey="PGPU_ID=4284" DBaction="K" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.05,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=8827" DBaction="L" version="6.02">