我试图在 XML文件中动态执行查找和替换的shell脚本。
例如
<Field name="Bytes" type="com.sunopsis.sql.DbInt"><![CDATA[250]]></Field>
<Field name="CheckFlow" type="java.lang.String"><![CDATA[0]]></Field>
<Field name="CheckStat" type="java.lang.String"><![CDATA[0]]></Field>
[. . .] Other Lines like this
The next line is my UNIQUE string
<Field name="ColName" type="java.lang.String"><![CDATA[COMPANY_NAME_BG]]></Field>
[. . .] Other Lines like this
<Field name="Longc" type="com.sunopsis.sql.DbInt"><![CDATA[250]]></Field>
[. . .] Other Lines like this
结果应为
<Field name="Bytes" type="com.sunopsis.sql.DbInt"><![CDATA[REPLACEMENT]]></Field>
<Field name="CheckFlow" type="java.lang.String"><![CDATA[0]]></Field>
<Field name="CheckStat" type="java.lang.String"><![CDATA[0]]></Field>
[. . .] Other Lines like this
The next line is my UNIQUE string
<Field name="ColName" type="java.lang.String"><![CDATA[COMPANY_NAME_BG]]></Field>
[. . .] Other Lines like this
<Field name="Longc" type="com.sunopsis.sql.DbInt"><![CDATA[REPLACMENT]]></Field>
[. . .] Other Lines like this
我必须为找到的每个UNIQUE字符串找到并编辑仅第一次出现(之前/之后)
答案 0 :(得分:1)
如果我正确理解您的要求,那么您将使用"display:none"
:
xmlstarlet
其工作方式如下:xmlstarlet ed \
-u '//Field[@name="Bytes"]' -x 'following-sibling::Field[@name="ColName"][1]/text()' \
-u '//Field[@name="Longc"]' -x 'preceding-sibling::Field[@name="ColName"][1]/text()' \
input.xml
表示“更新”由以下xpath表达式指定的元素或属性,-u XPATH
表示使用以下xpath表达式指定的元素或属性更新它(使用-x XPATH
表示固定值)。我们选择名称属性为 Bytes 或 Longc 的 Field 元素。现在,由于“字节字段”位于“ColName字段”之前,我们选择下一个“ColName字段”,并且由于“Longc字段”跟随“ColName字段”,我们选择< strong>上一个上一个“ColName字段”(索引略有反直觉)。 -v
表达式选择元素的内容,但这是可选的。