awk 将 platformio.ini 环境提取到 bash 数组

Awk to extract platformio.ini environments to a bash array

我正在尝试提取 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

我可以手动做 this

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

但我现在想从文件中提取信息。我试过了

awk '/\[env:.*\]/{print [=14=] }' platformio.ini

它列出了环境,但我如何创建包含该信息的数组? 我还看到 readarray 所以也许我可以创建一个包含所有行的数组,然后仅在条件匹配时才执行?我需要循环两次,这样只用我需要的信息创建数组会更干净。

使用 bash + awk 你可以这样做:

readarray -t environments < <(
   awk -F 'env:' 'NF==2 {sub(/\]$/, ""); print }' 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|$) 正则表达式,并在程序的主块中删除所有内容并仅从 gsubRT[env: 到 [=19] 之间获取 needed/required 输出部分=] 及其从 Input_file) 读取输入并将其输出发送到 readarray 命令以创建名为 environments 的 bash 数组。然后使用 declare -p 命令打印数组的值及其索引项以显示数组的结构。