linux - 使用 shell 脚本获取多行 XML 中的标签值

标签 linux bash shell

我有一个如下的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 模块的数据路径,那么应该得到

/my/file/path

对于第二个模块 id,比如 id2,我应该获取用逗号分隔的数据路径

/my/file/path, /my/file/path

或者我 grep 数据路径的第二种方法是替换 newline character之间<Module</Module>只有这样我才能使用grep。

最佳答案

-m1 告诉 grep 在第一个匹配行后退出,这就是它只打印一行输出的原因。 不过,我不会为此使用面向行的工具。还有更方便的工具用于解析 XML,例如 :

xml sel -t -m '//@dataPath' -v . -n file.xml

关于linux - 使用 shell 脚本获取多行 XML 中的标签值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56373165/

相关文章:

linux - 如何在 bash 脚本中将字符串或变量作为 awk 的多个参数传递?

windows - 将字符串回显到具有多行的 .txt 文件 - 使用 Windows 批处理文件

linux - 如何执行进程,在缺少基于文件系统的功能的情况下保留功能?

Linux 语法错误

bash - lxdialog和kconfig(menuconfig)如何协同工作?

arrays - 如何从任意索引开始将列表分配给数组

linux - 如何在全局范围内捕获 bash 中的 on_error?

linux - 巨大核心转储的 gdb 内存使用情况

linux - 大括号扩展 - 表达式太多

linux - Bash 脚本并行处理有限数量的命令