【问题标题】:how to change links in a xml or any other file with regex or some other way?如何使用正则表达式或其他方式更改 xml 或任何其他文件中的链接?
【发布时间】:2018-07-10 07:51:18
【问题描述】:

我有一个包含很多 xml 节点的文件,它们通过 id 链接在一起。我需要更改节点的 id 以及链接。

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

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

感谢任何帮助。

【问题讨论】:

    标签: regex shell replace find


    【解决方案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通常不是一个好主意,所以使用一些库来解析xmls会更好。

    【讨论】:

    • 但我需要用我从解析值计算的值替换这两个 id。这么简单的正则表达式是不够的
    • @AntarikshaYelkawar,好的,我编辑了我的答案。基本上你要么使用支持正则表达式替换函数的语言,要么执行几个步骤
    猜你喜欢
    • 1970-01-01
    • 2013-07-13
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    相关资源
    最近更新 更多