Awk для извлечения сред platformio.ini в массив bash

Я пытаюсь извлечь все среды, определенные в файле platformio.ini, чтобы я мог просмотреть их и выполнить некоторые действия перед сборкой. Файл выглядит так:

; PlatformIO Project Configuration File

[env]
extra_scripts = pre:./somescript.py

[env:FirstEnvironment]
platform = atmelavr
board = nanoatmega328
framework = arduino

[env:SecondEnvironment]
platform = atmelavr
board = nanoatmega328
framework = arduino

Я могу вручную сделать это

declare -a environments=(
"FirstEnvironment" 
"SecondEnvironment"
)
for i in "${environments[@]}"
do
    echo "$i"
done

Но теперь я хочу извлечь информацию из файла. я пробовал

awk '/\[env:.*\]/{print $0 }' platformio.ini

И в нем перечислены среды, но как я могу создать массив с этой информацией? Я также видел чтение массива, так что, может быть, я мог бы создать массив со всеми строками, а затем выполнять только в том случае, если есть совпадение в условии? Мне нужно зациклить это дважды, поэтому было бы чище создать массив только с той информацией, которая мне нужна.

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
1
0
40
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

С помощью bash + awk вы можете сделать это:

readarray -t environments < <(
   awk -F 'env:' 'NF==2 {sub(/\]$/, ""); print $2}' file)

# check content of array
declare -p environments

declare -a environments=([0]="FirstEnvironment" [1]="SecondEnvironment")

Или еще:

for i in "${environments[@]}"; do
    echo "$i"
done

С показанными вами примерами и попытками попробуйте awk код, написанный и протестированный в GNU awk.

readarray -t environments < <(
   awk -v RS='(^|\n)\\[env:[^]]*\\](\n|$)' 'RT{gsub(/^\n|\n$|\n\[env:|\]\n/,"",RT);print RT}' Input_file)

# Get/print contents of array name environments here:
declare -p environments


##Output of printing array's elements will be:
declare -a environments=([0]="FirstEnvironment" [1]="SecondEnvironment")

Объяснение: Простым объяснением будет запуск команды awk (где установка регулярного выражения RS на (^|\n)\\[env:[^]]*\\](\n|$) и в основном блоке программы удаление всего и получение только необходимой/необходимой части вывода из gsub в RT между [env: и до ] и чтение ввода из Input_file) и отправив свой вывод команде readarray для создания массива bash с именем environments. Затем с помощью команды declare -p распечатайте значения массива вместе с его элементами индекса, чтобы показать структуру массива.

Другие вопросы по теме