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

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_IDDBaction并且version可以是不同的。所以每当tablename ="Data"version6.02,那么sed命令应该只有6.02保持其他值完全相同的替代版本。

Kus*_*nda 6

使用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 ...就地编辑文档(小心使用)。

  • @DebajitDutta 然后通过您需要通过的任何协议在您的生产服务器上引入`xmlstarlet`。我建议将它安装在生产服务器上,而不是添加损坏的本土 XML 解析代码,这可能会危及您的生产系统。 (4认同)
  • @DebajitDutta 我再怎么强调都不为过:使用像`sed`(或默认情况下为`awk`)这样的面向行的工具进行XML 解析很脆弱,很难做到正确,但很容易做quick-n-dirty hacky编辑与。使用专用的 XML 解析器更安全。 (2认同)
  • @DebajitDutta 不幸的是,您将不会从我那里得到一个执行 XML 解析的 `sed` 命令。 (2认同)