如何用sed命令替换XML中指定name标签后的value标签内容
问题:用sed修改XML中指定name对应的value标签值
需要用sed命令将XML文件中<name>hive.metastore.schema.verification</name>标签对应的<value>内容替换为false。由于文件中存在大量<value>标签,必须关联对应的name标签来定位,但多次尝试正则表达式均未成功。
示例XML片段
<property> <name>hive.metastore.schema.verification</name> <value>true</value> <description> foobar </description> </property>
当前尝试的命令
sed '/<property>/!b;:a;/<\/property>/!{$!{N;ba}};/hive.metastore.schema.verification</s/.* /&<value>false</value> /' hive-site.xml
解决方案
基础版命令(适用于name与value紧邻的场景)
sed '/<property>/,/<\/property>/{/<name>hive.metastore.schema.verification<\/name>/{n;s/<value>.*<\/value>/<value>false<\/value>/}}' hive-site.xml
健壮版命令(适配name与value间存在空白行/其他内容的场景)
sed '/<property>/,/<\/property>/{/<name>hive.metastore.schema.verification<\/name>/{:loop;n;/<value>/!bloop;s/<value>\s*.*\s*<\/value>/<value>false<\/value>/}}' hive-site.xml
命令逻辑说明
- 锁定目标块:
/<property>/,/<\/property>/匹配每个完整的<property>到</property>代码块,避免修改其他块的内容。 - 定位目标name:在块内检查是否包含指定的name标签,确保只处理目标配置项。
- 找到并替换value:
- 基础版用
n直接跳到name标签的下一行(即对应的value行),执行替换。 - 健壮版通过
:loop循环,直到找到<value>行再替换,适配XML格式不规整的情况。
- 基础版用
- 替换规则:
s/<value>\s*.*\s*<\/value>/<value>false<\/value>/会匹配value标签内的任意内容(包含前后空白),替换为false。
原命令问题分析
你之前的命令会将整个匹配的property块内容替换为原内容拼接新的value标签,这会破坏原有XML结构,导致重复的value标签或内容错乱,逻辑不符合需求。
内容的提问来源于stack exchange,提问作者Dhayf OTHMEN
相关产品推荐
相关产品推荐

