使用 sed 命令在 xml 文件的特定位置插入文本

使用 sed 命令在 xml 文件的特定位置插入文本

我试图弄清楚如何使用 sed 命令在 xml 文件中插入文本。我开始使用 sed 尝试一些基本命令:

sed -i -e ' <property name="prop1" ref="ANOTHER_BEAN" /> ' my_config_file.xml  

它添加了这一行,但不在我想要的位置

我的具体情况的问题是文本应该添加到某个位置(某个bean,因为它是一个java配置文件)

例子

 <bean id="BEAN_ID_1"
    class="com.toto.BeanClass1"
    scope="prototype">
    <property name="prop1" ref="ANOTHER_BEAN_1" />
    <property name="prop2" ref="BEAN1" />
 </bean>

<bean id="BEAN_ID_2"
    class="com.toto.BeanClass2"
    scope="prototype">
    <property name="prop_1" ref="ANOTHER_BEAN_2" />
    <property name="prop_2" ref="BEAN2" />
 </bean>

我想将此属性添加到封闭标记之前名为“BEAN_ID_1”的 bean

 <property name="property" ref="ANOTHER_BEANXXX" />

所以输出将是:

 <bean id="BEAN_ID_1"
    class="com.toto.BeanClass1"
    scope="prototype">
    <property name="prop1" ref="ANOTHER_BEAN_1" />
    <property name="prop2" ref="BEAN1" />
    <property name="property" ref="ANOTHER_BEANXXX" />
 </bean>

<bean id="BEAN_ID_2"
    class="com.toto.BeanClass2"
    scope="prototype">
    <property name="prop_1" ref="ANOTHER_BEAN_2" />
    <property name="prop_2" ref="BEAN2" />
 </bean> 

PS:我不能依赖行号,因为在生产中我不知道文件是怎样的

有人可以帮我解决这个问题吗?多谢

答案1

使用 XML 解析器/编辑器来编辑 XML 始终比尝试用sed.

我已经修复了您的 XML 示例,将其全部封装起来,<beans>...</beans>使其成为有效的 XML。这是一个使用以下解决方案xmlstarlet

xmlstarlet edit --subnode '//bean[@id="BEAN_ID_1"]' -t elem -n property --var this '$prev' --insert '$this' -t attr -n name -v property --insert '$this' -t attr -n ref -v 'ANOTHER_BEANXXX' configFile

输出

<?xml version="1.0"?>
<beans>
  <bean id="BEAN_ID_1" class="com.toto.BeanClass1" scope="prototype">
    <property name="prop1" ref="ANOTHER_BEAN_1"/>
    <property name="prop2" ref="BEAN1"/>
    <property name="property" ref="ANOTHER_BEANXXX"/>
  </bean>
  <bean id="BEAN_ID_2" class="com.toto.BeanClass2" scope="prototype">
    <property name="prop_1" ref="ANOTHER_BEAN_2"/>
    <property name="prop_2" ref="BEAN2"/>
  </bean>
</beans>

该行的解释xmlstarlet

# Edit the XML, writing the result to stdout
xmlstarlet edit

# Create a subnode called "property" of "//bean" having an attribute id="BEAN_ID_1"
--subnode '//bean[@id="BEAN_ID_1"]' -t elem -n property

# Identify this new element as "this"
--var this '$prev'

# Insert an attribute called "name" with a value "property" into the new element
--insert '$this' -t attr -n name -v property

# Insert an attributed called "ref" with a value "ANOTHER_BEANXXX" into the new element
--insert '$this' -t attr -n ref -v 'ANOTHER_BEANXXX'

# XML source file
configFile

答案2

您可能会考虑使用 xml 解析器来解析 xml;会更加稳健。

但也许是这样的?

sed -i '/<bean id="BEAN_ID_1"/,/<\/bean>/ s/<\/bean>/   <property name="property" ref="ANOTHER_BEANXXX" \/>\n<\/bean>/' my_config_file.xml

<bean id="BEAN_ID_1"这意味着在以 开头和结尾的范围内,在之前</bean>插入该行。<property name="property" ref="ANOTHER_BEANXXX" /></bean>

相关内容