广告
返回顶部
首页 > 资讯 > 操作系统 >使用shell读取ini文件方法步骤
  • 678
分享到

使用shell读取ini文件方法步骤

shell读取ini文件shell读取ini 2022-06-09 12:06:42 678人浏览 八月长安
摘要

目录动机.ini 类文件格式在 shell 脚本中处理 .ini 文件时要执行的操作假定处理系统查看部分列表仅提取特定部分如何限定 shell 变量名Shell scripting动机 我决定编写一个脚本来进行干净的 M

目录
  • 动机
  • .ini 类文件格式
  • shell 脚本中处理 .ini 文件时要执行的操作
  • 假定处理系统
  • 查看部分列表
  • 仅提取特定部分
  • 如何限定 shell 变量名
  • Shell scripting

动机

我决定编写一个脚本来进行干净的 MacOS (BSD) / linux 的初始设置。 我认为有一个 tsukkomi 说“现在大多数发行版都预装了 perl / python”,但我决定使用 Shell 脚本(bash),因为它易于编写进程过程。 但是,用shell语法写各种配置文件是不可读的,所以我决定把配置文件写成.ini文件,用sed处理,然后加载到shell中。 关于使用 sed 解析 .ini 文件,如果你在 Google 上搜索会出现各种示例,但我决定将其作为可以处理 .ini 文件(如)的规范,通过引用它们更具可读性。

.ini 类文件格式

  • 在 [section] 中设置节。紧接在 [和紧接之前] 之后的空白字符序列(空格 / 制表符)不被视为部分名称的一部分。 (规定可以在节名及其前后的括号之间放置空格字符。)但是,节名不应包含换行符。
  • 用 parameter = value 设置参数变量及其值。 = 前后可以有空格。假设参数名称不包括=。如果参数名称包含不能在 shell 变量中使用的字符,则在输出的 shell 变量名称中将这些字符替换为 _。
  • 如果行尾有 \,则下一行被视为续行。如果一行的开头有 4 个或更多空格/制表符,则将其视为上一行的续行。
  • 忽略 # ,; 中的行尾作为注释。
  • 忽略不包含 [and’]’ 的行,或在行首以外的位置不包含 = 的行。

在 shell 脚本中处理 .ini 文件时要执行的操作

查看部分列表。

将参数作为 shell 变量读取。 然而,作为一种变体

1. 让特定部分的参数为 shell 变量。 在某些情况下,将其设置为 shell 函数中的局部变量或环境变量。
2. 让所有或部分部分的参数为 shell 变量。 shell变量名是’基于段名的前缀’+‘参数名’。 同样在这种情况下,将其设置为局部变量或环境变量。 基于节名的前缀是通过将节名字符串中的shell变量中不能使用的字符替换为_并在末尾添加_来生成的。

假定处理系统

  • bash
  • BSD sed(我不能使用方便的 GNU sed 扩展,但我想在干净的 macOS 上运行它。)但是,我使用带有 -E 选项的扩展正则表达式。 (因为如果不能使用一个或多个匹配元字符’+',sed 语句就会变长。)

处理连续行和注释似乎有更普遍的用途,所以我单独描述。 通过将代码添加到那里描述的 sample5.sed 来实现上述内容。

查看部分列表

这相对容易。 不要处理与节名格式不匹配的行。 您所要做的就是删除与节名格式和输出相对应的行中的’[‘,’]’ 和不必要的部分。 这时候需要注意的是,换行符不是随便删的,如单独描述的,匹配换行符以外的表达式([^ \ [:space:]]] | [[ : 空白: ]]) 被使用。

:begin
$!N
s/[#;]([^[:space:]]|[[:blank:]])*([^\\[:space:]]|[[:blank:]])(\n)/\3/
s/[#;]([^[:space:]]|[[:blank:]])*(\\)(\n)/\2\3/
$s/[#;]([^[:space:]]|[[:blank:]])*$//
/(\\\n|\n[[:blank:]]{4})/ {
  s/[[:blank:]]*(\\\n|\n[[:blank:]]{4})[[:blank:]]*/ /
  t begin
}
/^[[:blank:]]*\n/ D
/\n[[:blank:]]*$/ {
  s/\n[[:blank:]]*$//
  t begin
}
/^\[([^[:space:]]|[[:blank:]])*\]/! D
s/\[[[:blank:]]*//
s/[[:blank:]]*\]([^[:space:]]|[[:blank:]])*//
P
D

例如,如果您尝试将其作为示例 .ini 文件,

# -*- mode: conf-mode ; -*- \
#;
#; sample .ini file
#;
#;

[tako]
param_a=(1 # 2 3 \
4 5 ### 6 7
  8 9 # 10
  )

a=b # kani \
# kani \


[kani]
param_a=1
param_b=2

[uni]
param_a=3
param_b=4

[wani]
param_a=5
param_b=6

[hebi]
param_a=9
param_b=10

output example:

% sed -nE -f list_section.sed sample.ini
tako
kani
uni
wani
hebi

仅提取特定部分

下面的示例仅从上面的示例中提取特定部分 (wani) 的行,这些行遵循正确的参数定义格式。如果您找到以节名形式存在的一行,请将节名存储在保留空间中,否则如果保留空间的内容与所需的节名不匹配,则转到下一行。…如果匹配,则检查是否匹配参数格式的定义,去掉空格,本例中添加文本,使其成为shell函数的局部变量,可以总结shell变量定义。在行尾。因为已经变长了,所以加了注释行,但是作为控制结构,对每个处理都进行必要的处理,如果后面的处理没有必要,就直接回到开头. , 应该比较容易理解。

:begin
$!N
# Erase comment strings
s/[#;]([^[:space:]]|[[:blank:]])*([^\\[:space:]]|[[:blank:]])(\n)/\3/
s/[#;]([^[:space:]]|[[:blank:]])*(\\)(\n)/\2\3/
$s/[#;]([^[:space:]]|[[:blank:]])*$//
# Concatenate continuation lines
/(\\\n|\n[[:blank:]]{4})/ {
 s/[[:blank:]]*(\\\n|\n[[:blank:]]{4})[[:blank:]]*/ /
 t begin
}
# Erase blank lines
/^[[:blank:]]*\n/ D
/\n[[:blank:]]*$/ {
 s/\n[[:blank:]]*$//
 t begin
}
# Check section headline and store section name to holdspace
/^([^[:space:]]|[[:blank:]])*\[([^[:space:]]|[[:blank:]])*\]/ {
h
x
s/^([^[:space:]]|[[:blank:]])*\[(([^[:space:]]|[[:blank:]])*)\].*$/\2/g
s/^[[:blank:]]*//g
s/[[:blank:]]$//g
x
D
}
# Skip line if current section is not interested one
x
/^wani$/! {
 x
 D
}
x
# Print if it is proper parameter definition
/^(([^[:space:]=]|[[:blank:]])*)=(([^[:space:]]|[[:blank:]])*)/ {
 s/^[[:blank:]]*/local /
 s/[[:blank:]]*=[[:blank:]]*/=/
 s/(([^[:space:]]|[[:blank:]])*)[[:blank:]]*(\n)/\1;\3/
 P
}
D

如何限定 shell 变量名

如关于您想要做什么的部分中所述,您想要添加从部分名称生成的前缀到 shell 变量,或者如果 .ini 文件中的参数名称包含不能在 shell 变量中使用的字符串, 适当转换。 作为一种简单的方法,有多次调用sed并处理的方法,但是如果可以的话,我觉得用一个进程号sed就可以处理更漂亮。 这里最大的限制是 sed 没有一个保存空间。 在高级脚本语言中,可以将文本段划分为多个变量,进行存储、处理和组合。 另一方面,在 sed 的情况下,标准方法似乎是将多个文本作为堆栈保存和使用,并将保留空间作为分隔符并带有换行符。

例如,在下面的示例中,保留空间从第一行开始。

  • 部分名称
  • 带格式化部分名称的前缀
  • 模式空间第一行的备份
  • 模式空间第二行的备份
  • 根据.ini文件中的参数名格式化的Shell变量名

需要决定如何使用它,保持保持空间中的行数不变(下例中为 2 行),并在处理行转换时适当恢复模式空间。 由于交换保持空间和模式空间的命令只有gG和hH,类似的处理可能会重复出现,所以不可否认在1sed的过程中做起来真的很漂亮。

不管怎样,下面是从上面的 sample.ini 文件中提取 wani 和 uni 部分并输出添加了部分名称的 shell 变量的定义语句的示例。 整体控制结构保持简单,并且我添加了注释,所以我希望你能看到重写的地方以提取另一个部分,例如。

# Initialine the hold space: (Single empty line at the beginning)
1 { H ; x ;
 # Change the expression for the defalut section name and/or variable prefix, here.
 s/^([^[:space:]]|[[:blank:]])*(\n)([^[:space:]]|[[:blank:]])*$/global\2global_/g
 x
}
:begin
$!N
# Erase comment strings
s/[#;]([^[:space:]]|[[:blank:]])*([^\\[:space:]]|[[:blank:]])(\n)/\3/
s/[#;]([^[:space:]]|[[:blank:]])*(\\)(\n)/\2\3/
$s/[#;]([^[:space:]]|[[:blank:]])*$//
# Concatenate continuation lines
/(\\\n|\n[[:blank:]]{4})/ {
 s/[[:blank:]]*(\\\n|\n[[:blank:]]{4})[[:blank:]]*/ / ; t begin
}
# Erase blank lines
/^[[:blank:]]*\n/ D
/\n[[:blank:]]*$/ {
 s/\n[[:blank:]]*$// ; t begin
}
# Check section headline and store section name to holdspace
/^([^[:space:]]|[[:blank:]])*\[([^[:space:]]|[[:blank:]])*\]/ {
 # Remove blackets and extra spaces at first line
 s/^([^[:space:]]|[[:blank:]])*\[(([^[:space:]]|[[:blank:]])*)\](([^[:space:]]|[[:blank:]])*)(\n)/\2\6/g
 s/^[[:blank:]]*//g; s/[[:blank:]]*(\n)/\1/g
 # Store the section name to the hold space, and fORMat stored one for shell variable for the hold space
 h
 x
 s/(\n)([^[:space:]]|[[:blank:]])*$//
 s/([^[:alnum:]_]|$)/_/g
 x
 # Append the section name to the hold space.
 H
 # Remove unused line of the hold space and rearrange the remaining lines.
 x
 s/(([^[:space:]]|[[:blank:]])*)(\n)(([^[:space:]]|[[:blank:]])*)(\n)(([^[:space:]]|[[:blank:]])*)$/\4\3\1/
 x
 D
}
# Skip line if current section is not interested one
x
/^(wani|uni)(\n)/! { x ; D ; }
x
# Print if it is proper parameter definition
/^(([^[:space:]=]|[[:blank:]])*)=(([^[:space:]]|[[:blank:]])*)/ {
 # Store current patern space text at the end of the hold space
 H

 # Build shell script variable name and store it at the end of the hold space
 s/(([^[:space:]=]|[[:blank:]])*)=.*$/\1/g
 s/^[[:blank:]]*//
 s/[[:blank:]]*$//
 s/[^[:alnum:]_]/_/g
 # If further rename of the variable name is necessary, put here.

 # Store variable name at the end of the hold space
 H

 # Build parameter variable value and keep it at pattern space
 # At first, Resore the current line text from hold space
 g
 # Remove unused lines.
 s/^(([^[:space:]]|[[:blank:]])*\n){2}//
 s/(\n([^[:space:]]|[[:blank:]])*){2}$//
 # Remove the text other than the parameter value
 s/^([^[:space:]=]|[[:blank:]])*=//g
 # If further formatting of the value is necessary, put here.

 # Append hold space stored date into pattern space
 G
 # Remove unused lines from the pattern space
 s/^(([^[:space:]]|[[:blank:]])*\n)(([^[:space:]]|[[:blank:]])*\n)(([^[:space:]]|[[:blank:]])*\n)(([^[:space:]]|[[:blank:]])*\n)(([^[:space:]]|[[:blank:]])*\n)/\1\5\9/
 # Rearrance the order of line in the pattern space, it is nessacery because only \1 ...\9 is avaiable
 s/^(([^[:space:]]|[[:blank:]])*\n)(([^[:space:]]|[[:blank:]])*\n)(([^[:space:]]|[[:blank:]])*)(\n)(([^[:space:]]|[[:blank:]])*)$/\1\3\8\7\5/

 # Format the output in the first line of the pattern space, and
 # Restore the next line PbzdjZkQyOat the second line of the pattern space
 s/^(([^[:space:]]|[[:blank:]])*)(\n)(([^[:space:]]|[[:blank:]])*)(\n)(([^[:space:]]|[[:blank:]])*)(\n([^[:space:]]|[[:blank:]])*)$/local \4\7=\1;\9/

 # Clean up hold space
 x
 s/(\n([^[:space:]]|[[:blank:]])*){3}$//
 x
 P
}
D

output example:

% sed -n -E -f pickup_section2.sed sample.ini
local uni_param_a=3;
local uni_param_b=4;
local wani_param_a=5;
local wani_param_b=6;

Shell scripting

每次更改要提取的section或者切换输出格式(sh/csh、shell变量/局部变量/环境变量、变量名前缀的ON/OFF)都要重写sed文件很麻烦,所以命令行我准备了生成 sed 命令作为选项的 shell 脚本。 使用另一篇文章中的模板生成。 对于上面的seds,我还尝试了通过.ini文件的参数变量名(shell变量名)来选择输出。 (但是,如果指定了多个段名和变量名,组合不是唯一的,所以它可能不是一个很有用的功能。)

文件存储:

https://GitHub.com/nanigashi-uji/parse_ini_sh
Https://gitlab.com/nanigashi_uji/parse_ini_sh

如何使用

[Usage] % parse_ini.sh -list   file [files ...]
    % parse_ini.sh [options] file [files ...]

[Options]
  -l,--list            : List sections
  -S,--sec-select    name   : Section name to select
  -T,--sec-select-regex expr   : Section reg. expr. to select
  -V,--variable-select name    : variable name to select
  -W,--variable-select-regex expr : variable reg. expr. to select
  -L,--local           : Definition as local variables (B-sh)
  -e,--env            : Definition as enviromnental variables
  -q,--quot            : Definition by quoting with double/single-quotation.
  -c,--csh,--tcsh         : Output for csh statement (default: B-sh)
  -b,--bsh,--bash         : Output for csh statement (default)
  -s,--sec-prefix         : add prefix: 'sectionname_' to variable names.
  -v,--verbose          : Verbose messages
  -h,--help            : Show Help (this message)

output example:

% parse_ini.sh --list sample.ini
tako
kani
uni
wani
hebi

% parse_ini.sh -S kani -L sample.ini
local param_a=1;
local param_b=2;

% parse_ini.sh -S kani -L -s sample.ini
local kani_param_a=1;
local kani_param_b=2;

% parse_ini.sh -S kani -L -e -c sample.ini
setenv param_a 1;
setenv param_b 2;

% parse_ini.sh -S kani -L -e -c -q sample.ini
setenv param_a "1";
setenv param_b "2";

 到此这篇关于使用shell读取ini文件方法步骤的文章就介绍到这了,更多相关shell读取ini文件内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

--结束END--

本文标题: 使用shell读取ini文件方法步骤

本文链接: https://www.lsjlt.com/news/30894.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 使用shell读取ini文件方法步骤
    目录动机.ini 类文件格式在 shell 脚本中处理 .ini 文件时要执行的操作假定处理系统查看部分列表仅提取特定部分如何限定 shell 变量名Shell scripting动机 我决定编写一个脚本来进行干净的 m...
    99+
    2022-06-09
    shell读取ini文件 shell读取ini
  • Shell实现读取ini格式配置文件方法
    ini文件格式一般都是由节、键、值三部分组成 格式: [第一节 ] 第一个键 = 值 第二个键 = 第二个值 [第二节 ] 第一个键 = val1,val2,val3 例子: [COM] KINGGOO...
    99+
    2022-06-04
    配置文件 格式 方法
  • Shell脚本读取ini配置文件的实现方法
    本篇内容介绍了“Shell脚本读取ini配置文件的实现方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、简单版参考stackoverfl...
    99+
    2023-06-09
  • python读取/写入配置文件ini方法
    在写测试脚本时,经常有一些需要变动的数据,可以单独放在ini文件里,然后读取传递给 相应的函数,这样程序操作更灵活。具体的方法介绍如下: 文件结构: Cofig.ini内容:[test1]ip = 10.10.10.10 [test2]po...
    99+
    2023-01-31
    配置文件 方法 python
  • Golang使用ini库读取配置的方法
    本篇内容介绍了“Golang使用ini库读取配置的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!go-ini的分区go-ini的多个配置...
    99+
    2023-06-30
  • C语言读取写入ini配置文件的方法实现
    目录一、了解什么是INI文件?二、INI文件的格式三、解析上述文件四、测试如下一、了解什么是INI文件? ini 文件是Initialization File的缩写,即初始化文件,这...
    99+
    2022-11-12
  • js使用xlsx读取excel文件的详细步骤
    目录下载安装插件文件基础获取文件对象读取文件数据读取Excel通过xlsx获取workbookWorkBook介绍读取WorkBook导出Excel生成sheet总结下载安装插件 n...
    99+
    2022-11-13
  • Shell逐行读取文件的4种方法
    在Linux中有很多方法逐行读取一个文件的方法,其中最常用的就是下面的脚本里的方法,而且是效率最高,使用最多的方法。为了给大家一个直观的感受,我们将通过生成一个大的文件的方式来检验各种方法的执行效率。 方...
    99+
    2022-06-04
    种方法 文件 Shell
  • shell按行读取文件的3种方法
    方法有很多,下面写出三种方法:写法一: #!/bin/bashwhile read linedoecho $linedone < filename(待读取的文件) 写法二: #!/bin/bashca...
    99+
    2022-06-04
    种方法 文件 shell
  • shell按行读取文件的方法有哪些
    这篇文章主要介绍“shell按行读取文件的方法有哪些”,在日常操作中,相信很多人在shell按行读取文件的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”shell按行读取文件的方法有哪些”的疑惑有所...
    99+
    2023-06-09
  • 用Shell实现逐行读取文件的4种方法
    这篇文章主要介绍“用Shell实现逐行读取文件的4种方法”,在日常操作中,相信很多人在用Shell实现逐行读取文件的4种方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”用Shell实现逐行读取文件的4种方法...
    99+
    2023-06-09
  • python使用pandas读取csv文件的方法
    目录pandas读取csv文件的操作1. 读取csv文件在这里记录一下,python使用pandas读取文件的方法用到pandas库的read_csv函数 # -*- coding:...
    99+
    2022-12-23
    python 读取csv文件 pandas读取csv文件
  • node中使用shell脚本的方法步骤
    背景 在开发中我们在特定的场合下可能需要一些脚本来批量处理我们的业务逻辑,在nodejs如何调用shell脚本呢? 新建 项目下新建脚本文件 touch newFile.sh...
    99+
    2022-11-11
  • shell读取文件内容并赋值的方法是什么
    在Shell脚本中,可以使用以下方法读取文件内容并赋值:1、使用反引号可以使用反引号将读取文件的命令括起来,将文件内容作为命令的输出...
    99+
    2023-05-13
    shell读取文件内容 shell
  • Python使用defaultdict读取文件各列的方法
    本文实例讲述了Python使用defaultdict读取文件各列的方法。分享给大家供大家参考,具体如下: #!/usr/bin/python """USAGE: python *.py align_SN...
    99+
    2022-06-04
    文件 方法 Python
  • java中怎么使用read方法读取文件
    在Java中,可以使用java.io包中的File、FileReader和BufferedReader类来读取文件。以下是一个简单的...
    99+
    2023-08-12
    java read
  • 使用shell脚本安装lnmp的方法步骤
    1、简介 使用shell脚本安装lnmp,纯粹是偷懒,平时安装一些东西都写成脚本了,方便以后在其他机器安装的时候不用再去查找文档。 php版本5.6.6 mysql版本5.6.26 NGINX版本1.15....
    99+
    2022-06-04
    shell安装lnmp
  • Android应用读取Excel文件的方法
    本文实例讲述了Android应用读取Excel文件的方法。分享给大家供大家参考,具体如下: ReadExcel.java文件: public class ReadExcel ...
    99+
    2022-06-06
    方法 Android
  • 使用Bash读取和处理CSV文件的方法
    目录介绍如何使用 cut 命令如何使用 IFS 将列存储在变量中如何使用 IFS 将列存储在数组中(●)对于空格或制表符分隔的文件如何处理要读取的CSV文件如何使用awk命令介绍 我将介绍它,因为在使用 linux Ba...
    99+
    2023-02-16
    Bash处理CSV Bash读取CSV
  • Shell脚本一次读取文件中一行的方法有哪些
    这篇文章主要讲解了“Shell脚本一次读取文件中一行的方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Shell脚本一次读取文件中一行的方法有哪些”吧!写法一:代码如下:#!/bin...
    99+
    2023-06-09
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作