【问题标题】:Find Substring from XML Tag using Shell Script使用 Shell 脚本从 XML 标记中查找子字符串
【发布时间】:2020-07-28 07:13:19
【问题描述】:

我有一个格式如下的 XML 文件:

<classes>

 <subject lb="Fall Sem 2020">
  <name>Operating System</name>
  <credit>3</credit>
  <type>Theory</type>
  <faculty>Prof. XYZ</faculty> 
 </subject>

 <subject lb="Spring Sem 2020">
  <name>Web Development</name>
  <credit>3</credit>
  <type>Lab</type>
 </subject>

 <subject lb="Fall Sem 2021">
  <name>Computer Network</name>
  <credit>3</credit>
  <type>Theory</type>
  <faculty>Prof. ABC</faculty> 
 </subject>

 <subject lb="Spring Sem 2021">
  <name>Software Engineering</name>
  <credit>3</credit>
  <type>Lab</type>
 </subject>

</classes>

预期输出:

Fall Sem 2020
Spring Sem 2020
Fall Sem 2021
Spring Sem 2021

我想在一个数组中提取lb 的值。

我的尝试:我尝试使用sed -n "/lb="/,\/"/p" file.xml,但这个命令没有给我特定标签的值。

解决这个问题的正确方法是什么?

【问题讨论】:

  • Don't Parse XML/HTML With Regex. 我建议使用 XML/HTML 解析器 (xmlstarlet, xmllint ...)。
  • 我知道 xmlstarlet 可以很好地处理所有与 xml 相关的操作,但目前我有一些限制。这就是我使用sed 命令的原因。

标签: arrays xml shell awk sed


【解决方案1】:

获取xml元素的属性值。

如果没有可用的 XML 解析器。使用 GNU sed:

sed -En 's/.* lb="([^"]+)".*/\1/p' file

输出:

秋季SEM 2020 2020 年春季学期 秋季SEM 2021 2021 年春季学期

【讨论】:

  • 另外,我需要一些很好的教程来处理我们在命令中给出的正则表达式。你会推荐我一些博客/教程吗?
  • This 可能有助于我使用的反向引用 (\1) 和 this 的非贪婪匹配 ([^"]+)。
  • 有什么办法可以在数组中得到这个结果?我尝试使用 arr=($(sed -En 's/.* lb="([^"]+)".*/\1/p' file)) 但这给了我单个单词作为数组元素。
  • 我建议开始一个新问题。
【解决方案2】:

考虑到您无法使用 xml 工具,请尝试关注awk

awk '
BEGIN{
  OFS=","
}
/<subject lb="/{
  match($0,/".*"/)
  print substr($0,RSTART+1,RLENGTH-2)
}
' Input_file

【讨论】:

    猜你喜欢
    • 2011-10-13
    • 1970-01-01
    • 2014-06-06
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多