我需要在 Linux 中使用 sed 来查找 XML 中一行的一部分并更新其中的值?

我需要在 Linux 中使用 sed 来查找 XML 中一行的一部分并更新其中的值?

我需要在sedLinux 上使用的 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_IDDBactionversion可以不同。因此,每当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">

相关内容