如何使用正则表达式或其他方式更改xml或任何其他文件中的链接?

时间:2018-07-10 07:51:18

标签: regex shell replace find

我有一个带有很多xml节点的文件,它们与一个id链接在一起。我需要更改节点的ID以及链接。

 <event id="12345">
     <action>6789</action>
 </event>
 <action id="6789">
     <name>pre-filter1</name>
     <someotherlink>45678</someotherlink>
 </action>

无论链接从何处,我都需要更改操作节点的ID和引用。我之所以研究正则表达式,是因为我必须为某些动作节点执行此操作,而仅使用某些特定名称(例如此处的预过滤器)进行操作即可。在替换为新值之前,需要通过某种逻辑来处理ID。节点的顺序是随机的。 我只需要对整个文件执行一次,任何方法都可以。时间复杂度也不是约束。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

Perl支持在替换正则表达式时使用函数。不确定其他语言。

如果您不使用perl,则可以执行以下操作:

1)使用此正则表达式获取给定名称的所有操作ID:

<action\s*id="(\d+)">(?=[^=]*<name>pre-filter\d<\/name>).*?<\/action> 

https://regex101.com/r/Q7lKgx/1

2)转换值,并将原始ID和转换后的值存储在哈希中。

3)循环哈希并使用正则表达式将id替换为新值

这同时匹配操作和操作ID:

(<action(?:\s*id="|>))(THE_ID)("|<\/action)> ==> replace with \1NEW_ID\3

无论如何,用正则表达式解析XML通常不是一个好主意,因此使用某些库来解析xml会更好。