【问题标题】:Storing String Output of SED Commnd in an Array In Shell Script在 Shell 脚本中将 SED 命令的字符串输出存储在数组中
【发布时间】:2020-07-28 10:27:23
【问题描述】:

我有一个格式如下的 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>

我可以使用sed 命令得到想要的结果。即sed -En 's/.* lb="([^"]+)".*/\1/p' file

输出:

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

我希望将此输出存储在一个数组中。 即

arr[0]="Fall Sem 2020"

我的尝试: arr=($(sed -En 's/.* lb="([^"]+)".*/\1/p' file)) 但在这种情况下,我将单个元素作为数组元素。 IE。 arr[0]="Fall"

【问题讨论】:

标签: arrays xml shell sed


【解决方案1】:

使用 bash:

# disable job control and enable lastpipe to run mapfile in current environment
set +m; shopt -s lastpipe

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

declare -p arr

输出:

声明 -a arr=([0]="2020 年秋季学期" [1]="2020 年春季学期" [2]="2021 年秋季学期" [3]="2021 年春季学期")

默认情况下禁用脚本作业控制。

【讨论】:

    【解决方案2】:

    请您尝试一下(考虑到 OP 没有 xml 工具,也无法安装它们)。

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

    要打印数组的所有元素,请使用:

    echo ${array[@]}
    Fall Sem 2020 Spring Sem 2020 Fall Sem 2021 Spring Sem 2021
    

    要打印特定元素,请使用:

    echo ${array[0]}
    Fall Sem 2020
    

    【讨论】:

      【解决方案3】:

      您可以使用诸如XmlStarlet 之类的XML 感知工具来提取您想要的属性,然后使用readarray 和进程替换将输出读入一个数组:

      $ readarray -t arr < <(xml sel -t -v 'classes/subject/@lb' infile.xml)
      $ declare -p arr
      declare -a arr=([0]="Fall Sem 2020" [1]="Spring Sem 2020" [2]="Fall Sem 2021" [3]="Spring Sem 2021")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-21
        • 1970-01-01
        • 1970-01-01
        • 2018-11-06
        • 2017-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多