首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash中的解析和reWriting INI文件

Bash中的解析和reWriting INI文件
EN

Unix & Linux用户
提问于 2022-11-19 13:13:37
回答 1查看 438关注 0票数 0

我有以下bash函数,用于加载INI文件并将其解析为两个数组,一个用于键,另一个用于值,然后使用这些数组编写一个新的INI文件。

代码语言:javascript
复制
declare -a ini_keys
declare -a ini_values

load_settings() {
    echo "Loading settings from \"$1\""
    ini_keys=()
    ini_values=()
    if [ -f "$1" ]; then
        ini_keys=($(awk -F ' *= *' '/^[a-z]/ {print $1}' "$1"))
        ini_values=($(awk -F ' *= *' '/^[a-z]/ {print $2}' "$1"))
        return 0
    fi
    echo "Missing \"$1\""
    return 1
}

save_settings() {
    echo "Saving settings to \"$1\""
    [ -f "$1" ] && mv "$1" "$1.bak"
    for index in "${!ini_keys[@]}"; do
        echo "${ini_keys[$index]}=${ini_values[$index]}" >> "$1"
    done
}

load_settings config.ini
save_settings new-config.ini

我遇到的问题是有时候我得到了一些空洞的价值

config.ini

代码语言:javascript
复制
key_01=value_01
key_02=value_02
key_03=
key_04=value_04
key_05=value_05

所以我最后得到了一个“newconfig.ini”

代码语言:javascript
复制
key_01=value_01
key_02=value_02
key_03=value_04
key_04=value_05
key_05=

如何解决这个问题以保留数组中和新编写的INI文件中的空值?

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2022-11-19 17:18:06

ini_values=($(awk -F‘*= *’/^/ {print $2}‘“$1))

您在这里依赖于分词,这确实会删除空字段,但是如果您的任何值都有空格,也会导致问题;它们会被分割成多个字段。而glob字符可能扩展为文件名。在这里有些讨论:为什么我的外壳脚本会被空格或其他特殊字符阻塞?

另外,为每个输入行运行一个或两个awk实例是相当高的开销。

幸运的是,shell的read内置可以在=上拆分输入,因此您可以执行以下操作。这里,使用关联数组,因为它们可以直接表示键值关系.但是如果你真的想要的话,你可以使用常规数组。

代码语言:javascript
复制
#!/bin/bash

configfile=config.ini
declare -A config

# read the ini file in
while IFS== read -r key val; do
    config+=(["$key"]="$val")
done < "$configfile"

# print and change one value
k=key_05
echo "key $k -> value ${config[$k]}"
config[$k]="foo bar"

# print it all out
for key in "${!config[@]}"; do
    printf "%s=%s\n" "$key" "${config[$key]}"
done
票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/725547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档