Сохранение строкового вывода команды SED в массиве в сценарии оболочки - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть 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)) Но в этом случае я получаю отдельный элемент как элемент массива. т.е. arr[0]="Fall"

Ответы [ 3 ]

1 голос
/ 15 апреля 2020

Не могли бы вы попробовать следующее (учитывая, что 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

Для печати указанного c элемента используйте:

echo ${array[0]}
Fall Sem 2020
1 голос
/ 15 апреля 2020

С 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

Вывод:

declare -a arr=([0]="Fall Sem 2020" [1]="Spring Sem 2020" [2]="Fall Sem 2021" [3]="Spring Sem 2021")

В скрипте управление заданиями по умолчанию отключено.

0 голосов
/ 15 апреля 2020

Вы можете использовать XML осведомленный инструмент, такой как XmlStarlet , чтобы извлечь нужный атрибут, а затем использовать 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...