【发布时间】:2017-08-05 07:24:17
【问题描述】:
我一直在努力使用触发器运算符来替换输入 xml 文件中的特定值。
文件结构如下:
<a>BLE</a>
<-- hur dur -->
<b>12345</b>
<-- hur der -->
<c>VER1.2.3</c>
<-- hur dest -->
<d>VER1.2.3</d>
<a>CLE</a>
<-- hur dur -->
<b>12345</b>
<-- hur der -->
<c>VERX'.Y'.Z'</c>
<-- hur dest -->
<d>VERX'.Y'.Z'</d>
<a>DLE</a>
<-- hur dur -->
<b>12345</b>
<-- hur der -->
<c>VERX".Y".Z"</c>
<-- hur dest -->
<d>VERX".Y".Z"</d>
etc ...
假设我想更改任何特定变量的版本字段(d 和 c)。为简洁起见,让它成为 BLE。我必须首先找到具有 BLE 值的块(第 1-7 行),然后用新值替换字段。
我一直在尝试不同的东西,比如:
perl -pi.bak -ne 'if ( /BLE/ .. /<\/d/ ){ s/VER[[:digit:]]\+\.[[:digit:]]\+\.[A-Z][[:digit:]]\+[A-Z]\?/$ver/}' dur.xml
或
perl -ne "print if ( /BLE/ .. /<\/d>/ ) " dur.xml | sed "/VER[[:digit:]]\+\.[[:digit:]]\+\.[[:digit:]]\+[A-Z]\?/$ver/"
其中 $ver 是一个集合变量 (ver="VERX.Y.Z")。但是第一个对输入文件没有做任何事情(我更喜欢就地做);第二个或多或少地产生了我想要的,但输出仅限于 BLE 块:
<a>BLE</a>
<-- hur dur -->
<b>12345</b>
<-- hur der -->
<c>VERX.Y.Z</c>
<-- hur dest -->
<d>VERX.Y.Z</d>
但是这个输出不能很容易地用 > 重定向到一个文件,因为它会丢弃除 BLE 之外的所有东西。
有什么方法可以像上面描述的那样修改原始文件吗?
非常感谢, 饮酒者
【问题讨论】:
-
该输入是否应该是真正的 XML?看起来不像。请包含一个确切的文件。
-
...另外,您的示例数据中没有任何
buildversion字符串... -
@simbabque 不,它不是真正的 XML - 我正在编辑的文件只有一个 .xml 扩展名 - 但结构有点相似。原来的样子也像这样,只有标签 a、b、c 和 d 有不同的名称
-
@jm666 糟糕,复制粘贴失败。固定
-
所以文件有标签块和空行,还有那些不是 cmets
<-- ... -->?而您只想更改<d>的<a>有BLE?