我有一个如下的xml文件
<Module dataPath="/abc/def/xyz" handler="DataRegistry" id="id1" path="test.so"/>
<Module id="id2" path="/my/file/path">
<Config>
<Source cutoffpackage="1" dailyStart="20060819" dataPath="/abc/def/xyz" />
<Source cutoffpackage="1" dailyStart="20060819" dataPath="/abc/def/xyz" id="V2"/>
</Config>
</Module>
我只想提取 dataPath
的值来自每个 moduleid
。
我正在使用类似的命令
`grep 'id2' file | grep -ioPm1 "(?<=DataPath=)[^ ]+"`
这是给我第一个模块ID,而不是第二个模块ID。因为第二个模块位于多行中。
如何使用 shell 脚本执行此操作?
期望的输出是 - 如果我想获取 id1 模块的数据路径,那么应该得到 p>
/my/file/path
对于第二个模块 id,比如 id2,我应该获取用逗号分隔的数据路径
/my/file/path, /my/file/path
或者我 grep 数据路径的第二种方法是替换 newline character
之间<Module
和</Module>
只有这样我才能使用grep。
最佳答案
-m1
告诉 grep 在第一个匹配行后退出,这就是它只打印一行输出的原因。
不过,我不会为此使用面向行的工具。还有更方便的工具用于解析 XML,例如 xmlstarlet :
xml sel -t -m '//@dataPath' -v . -n file.xml
关于linux - 使用 shell 脚本获取多行 XML 中的标签值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56373165/