Я пытаюсь извлечь все среды, определенные в файле 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
И в нем перечислены среды, но как я могу создать массив с этой информацией? Я также видел чтение массива, так что, может быть, я мог бы создать массив со всеми строками, а затем выполнять только в том случае, если есть совпадение в условии? Мне нужно зациклить это дважды, поэтому было бы чище создать массив только с той информацией, которая мне нужна.
С помощью 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
распечатайте значения массива вместе с его элементами индекса, чтобы показать структуру массива.