正则表达式替换每个子子节点的值



我正试图找出如何使用RegEx将子T节点替换为n="upper_bound",以防出现n="Key"值为32305的父T节点,从而将<T n="upper_bound">10</T>替换为<T n="upper_bound">ANY_NEW_VALUE_HERE</T>

我也更愿意留下评论。

XML格式的示例片段:

<U>
<T n="key">32304<!--Key for Y--></T>
<U n="value">
<T n="upper_bound">20</T>
</U>
</U>
<U>
<T n="key">32305<!--Key for X--></T>
<U n="value">
<T n="upper_bound">10</T>
</U>
</U>

显然不是错误的路径,因为我可以通过两种方式来解决它。我相信有一种更优雅的方法可以做到这一点,但它对我的作用域很有用,因为我可以对直接父节点进行假设。

PCRE RegEx:

(<T n="key">32305<!--Key for X--></T>n        <U n="value">n          <T n="upper_bound">).*(</T>)

替代:

$1NEW_VALUE_HERE$2

它将替换两个组之间的值。

使用NotePad++RegEx,我可以搜索整个硬编码文本,在我的情况下,我可以假设我要查找的节点的值是一个2位数的

<T n="key">32305<!--Key for X--></T>
<U n="value">
<T n="upper_bound">dd</T>

替换为:

<T n="key">32305<!--Key for X--></T>ntt<U n="value">nttt<T n="upper_bound">NEW_VALUE_HERE</T>

希望这能帮助到一些人,我会对其他解决方案感兴趣,而不是对我迅速不屑一顾的评论。

我知道你对第一反应中的快速轻蔑感到不高兴。

Jan的回答之所以如此简短,可能是因为在你提问的那一刻,他不知道你说的是NotePad++中的正则表达式。

由于修改XML文件的正确方法不是通过regex,我们已经厌倦了向访问SO的开发人员重复这一点。对此感到抱歉。

现在,对于您想要用脚本修改包括上面片段的XML文件的情况,正确的路径是:

xmlstarlet edit 
--update '//U/T[@n="key" and text()="32305"]//following-sibling::U' 
--value 'ANY_NEW_VALUE_HERE' input.xml

您将得到您想要的结果作为标准输出。也可以使用选项--inplace直接修改文件。

最新更新