pri*_*nka 2 xml shell sed xmlstarlet
我试图test用lookupinput.xml替换该值。脚本正在执行,没有任何错误,但它没有替换该值。
sed -i '/<Filter>/,/<\/Filter>/s/test/lookup/' input.xml > input_1.xml
Run Code Online (Sandbox Code Playgroud)
下面是我的 input.xml 文件:
<NikuDataBus
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="./src/webroot/WEB-INF/xog/xsd/nikuxog_entity.xsd">
<Header version="14.2" action="read" objectType="contentPack" externalSource="NIKU"/>
<LookupQuery>
<Filter name="code" criteria="EQUALS">test</Filter>
</LookupQuery>
</NikuDataBus>
Run Code Online (Sandbox Code Playgroud)
XML使用非语法感知工具解析sed是一个坏主意。如果XML格式稍有变化,解决方案就会中断。使用xmlstarlet哪个是用于编辑文件的语法感知工具。
由于您的文件在语法上也有效,因此解决您的问题非常简单。做就是了
xmlstarlet edit --update '//NikuDataBus/LookupQuery/Filter' --value 'lookup' input.xml
Run Code Online (Sandbox Code Playgroud)
要像 一样就地编辑文件sed -i,请使用-L解决方案的标志(如果您的版本支持它)或使用临时文件 ( > temp && mv temp input.xml)
xmlstarlet edit -L --update '//NikuDataBus/LookupQuery/Filter' --value 'lookup' input.xml
Run Code Online (Sandbox Code Playgroud)
或者,您可以更进一步,仅当Filter标签包含test您可以执行的操作时才进行替换
xmlstarlet edit --update '//NikuDataBus/LookupQuery/Filter[contains(.,"test")]' --value 'lookup' input.xml
Run Code Online (Sandbox Code Playgroud)
在以下版本的 Centos 7 上测试。
$ xmlstarlet --version
compiled against libxml2 2.9.1, linked with 20901
compiled against libxslt 1.1.28, linked with 10128
Run Code Online (Sandbox Code Playgroud)
感谢来自Perl专家Sundeep的有用评论之一,您可以看到可以遍历的路径列表,您可以在这些路径上应用操作xmlstarlet
$ xmlstarlet el input.xml
NikuDataBus
NikuDataBus/Header
NikuDataBus/LookupQuery
NikuDataBus/LookupQuery/Filter
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1265 次 |
| 最近记录: |