首页 > 解决方案 > 其他 XML 片段在通过 shell 脚本替换属性值和通过 shell 循环控制交互时被修剪

问题描述

在用随机数替换 RC 属性的值时,其他 xml 片段被修剪我)你们能提供解决方案和原因吗?II)您能否提供有关如何控制交互以替换特定范围的RC属性值的解决方案?例如:我想根据用户输入进行替换说,用户输入 3 和 3 RC 属性只能在输出中替换为随机

请参考 xml 文件:test.xml 和我的实际输出、使用的命令和预期的输出 test.xml

<documents><document id ="test"><doc:meta title = 'test-title'><doc-transform><item name="RC" value="1445352777130287"></item><item name="VERSION" value="05-07-0044"></item><item name="DATE" value="2021-08-25"></item></doc-transform></doc:meta></document><document id ="test-2"><doc:meta title = 'test-title-2'><doc-transform><item name="RC" value="3527771302"></item><item name="VERSION" value="05-07-0044"></item><item name="DATE" value="2021-08-25"></item></doc-transform></doc:meta></document></documents>

使用的命令:

var2=$随机

sed -E -i 's|(item name="RC" value=").*(">)|\1'$var2'\2|' 测试.xml

得到以下输出:

<documents><document id ="test"><doc:meta title = 'test-title'><doc-transform><item name="RC" value="23207"></item></doc-transform></doc:meta></document></documents>

预期输出:只有 RC 属性的值应该改变,它不应该影响其他 xml 片段

<documents><document id ="test"><doc:meta title = 'test-title'><doc-transform><item name="RC" value="78788"></item><item name="VERSION" value="05-07-0044"></item><item name="DATE" value="2021-08-25"></item></doc-transform></doc:meta></document><document id ="test-2"><doc:meta title = 'test-title-2'><doc-transform><item name="RC" value="78788"></item><item name="VERSION" value="05-07-0044"></item><item name="DATE" value="2021-08-25"></item></doc-transform></doc:meta></document></documents>

标签: linuxshell

解决方案


问题是您正在使用的贪婪正则表达式.*。您可以调试您的示例,将这个贪婪的正则表达式放在一个组中并打印内容,例如:

sed -E 's|(item name="RC" value=")(.*)(">)|\1\n\2\n\3|' test.xml|nl

输出:

1   <documents><document id ="test"><doc:meta title = 'test-title'><doc-transform><item name="RC" value="
2   1445352777130287"></item><item name="VERSION" value="05-07-0044"></item><item name="DATE" value="2021-08-25"></item></doc-transform></doc:meta></document><document id ="test-2"><doc:meta title = 'test-title-2'><doc-transform><item name="RC" value="3527771302"></item><item name="VERSION" value="05-07-0044"></item><item name="DATE" value="2021-08-25
3   "></item></doc-transform></doc:meta></document></documents>

第 2 行是贪婪的正则表达式的匹配。

要解决此问题,您需要重新匹配匹配,例如:

sed -E 's|(item name="RC" value=")[^"]*(">)|\1###########\2|' test.xml

输出:

<documents><document id ="test"><doc:meta title = 'test-title'><doc-transform><item name="RC" value="###########"></item><item name="VERSION" value="05-07-0044"></item><item name="DATE" value="2021-08-25"></item></doc-transform></doc:meta></document><document id ="test-2"><doc:meta title = 'test-title-2'><doc-transform><item name="RC" value="3527771302"></item><item name="VERSION" value="05-07-0044"></item><item name="DATE" value="2021-08-25"></item></doc-transform></doc:meta></document></documents>

但正如已经提到的,sed 不是处理 html/xml 的好工具。sed 仅当您的输入始终像您的输入示例时才会起作用。


推荐阅读