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