替换之前,然后在文件中的搜索点之后替换其他内容

时间:2016-06-24 12:17:13

标签: xml shell replace sed sh

我试图在 XML文件中动态执行查找和替换的shell脚本。

使用sed我在文件中找到一个唯一的字符串,现在问题是我必须替换之前的某些行的另一个字符串,然后在这个唯一字符串之后替换另一个字符串。

例如

<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字符串找到并编辑仅第一次出现(之前/之后)

1 个答案:

答案 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表达式选择元素的内容,但这是可选的。