我试图弄清楚如何使用 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>