解析在bash .ini文件

问题描述 投票:1回答:3

我有以下属性文件,并想为下面提及解析它。请在做这个帮助。

这是我创建的.ini文件:

[Machine1]

app=version1


[Machine2]

app=version1

app=version2

[Machine3]

app=version1
app=version3

我在寻找一个ini文件应分析等的溶液

[Machine1]app = version1
[Machine2]app = version1
[Machine2]app = version2
[Machine3]app = version1
[Machine3]app = version3

谢谢。

bash ini
3个回答
4
投票

尝试:

$ awk '/\[/{prefix=$0; next} $1{print prefix $0}' file.ini
[Machine1]app=version1
[Machine2]app=version1
[Machine2]app=version2
[Machine3]app=version1
[Machine3]app=version3

这个怎么运作

  • /\[/{prefix=$0; next} 如果有任何符合[开始,我们将保存行的变量prefix,然后我们跳过命令的其余部分,并跳转到next线。
  • $1{print prefix $0} 如果当前行不为空,我们打印的前缀后跟当前行。

Adding spaces

要添加周围=出现的任何空间:

$ awk -F= '/\[/{prefix=$0; next} $1{$1=$1; print prefix $0}' OFS=' = ' file.ini
[Machine1]app = version1
[Machine2]app = version1
[Machine2]app = version2
[Machine3]app = version1
[Machine3]app = version3

这是通过使用作为=输入和=作为输出字段分隔符字段分隔符。


2
投票

您可以尝试使用awk

 awk '/\[[^]]*\]/{          # Match pattern like [...]
        a=$1;next           # store the pattern in a
      } 
      NF{                   # Match non empty line
        gsub("=", " = ")    # Add space around the = character
        print a $0          # print the line
     }' file

0
投票

我爱@ John1024的答案。我一直在寻找这一点。我创建了一个bash函数,让我根据他的想法来查找节或特定键:

function iniget() {
  if [[ $# -lt 2 || ! -f $1 ]]; then
    echo "usage: iniget <file> [--list|<section> [key]]"
    return 1
  fi
  local inifile=$1

  if [ "$2" == "--list" ]; then
    for section in $(cat $inifile | grep "\[" | sed -e "s#\[##g" | sed -e "s#\]##g"); do
      echo $section
    done
    return 0
  fi

  local section=$2
  local key
  [ $# -eq 3 ] && key=$3

  # https://stackoverflow.com/questions/49399984/parsing-ini-file-in-bash
  # This awk line turns ini sections => [section-name]key=value
  local lines=$(awk '/\[/{prefix=$0; next} $1{print prefix $0}' $inifile)
  for line in $lines; do
    if [[ "$line" = \[$section\]* ]]; then
      local keyval=$(echo $line | sed -e "s/^\[$section\]//")
      if [[ -z "$key" ]]; then
        echo $keyval
      else          
        if [[ "$keyval" = $key=* ]]; then
          echo $(echo $keyval | sed -e "s/^$key=//")
        fi
      fi
    fi
  done
}

因此,考虑这是file.ini

[Machine1]
app=version1
[Machine2]
app=version1
app=version2
[Machine3]
app=version1
app=version3

然后下面的结果产生

$ iniget file.ini --list
Machine1
Machine2
Machine3

$ iniget file.ini Machine3
app=version1
app=version3

$ iniget file.ini Machine1 app
version1

$ iniget file.ini Machine2 app
version2
version3

再次,感谢@ John1024他的回答,我拉我的头发试图创建一个支持部分一个简单的bash INI解析器。

使用GNU的bash,版本5.0.0(1)-release下(x86_64-苹果darwin18.2.0)经测试在Mac

© www.soinside.com 2019 - 2024. All rights reserved.