如何从文件中的“key = value”字符串中获取值?

时间:2018-05-04 19:58:21

标签: linux bash shell

给定包含以下内容的文件:

// This is a comment
FOO = 1
BAR = 0
// Comments can be anywhere...
BAZ = 10 //...even here!

键始终锚定在一行的开头,但“=”字符两侧可能有任意数量的空格。该值也可以由任意数量的空格尾随。

编辑:值和/或其尾随空格也可能后跟注释。

如何使用bash脚本和/或awksed将密钥的价值作为一行?我希望能够做到这样的事情:

MYVAL=$(<string manipulation to get value of "BAZ" from /tmp/foo.txt>)

到达

>echo $MYVAL
10
>

我对bash脚本非常糟糕;从来没有足够流利的字符串操作工具套件知道如何处理这个。我能得到的最远的是

> grep BAZ /tmp/foo.txt
BAZ = 10

并且真的不知道下一步该做什么。

我确实搜索了SO,但找不到具有完全相同前提的解决方案(具体来说,'='两侧存在可变数量的空格),以及解决方案类似的问题在我的前提下不起作用。

2 个答案:

答案 0 :(得分:2)

ZipFile templateFile = new ZipFile(new File(dir_to_zip_file)); Enumeration<? extends ZipEntry> templateFileEntries = templateFile.entries(); while (templateFileEntries.hasMoreElements()) { ZipEntry entry = templateFileEntries.nextElement(); if (!skippableFiles.contains(entry.getName())) { zipOutputStream.putNextEntry(entry); if (!entry.isDirectory()) { copy(templateFile.getInputStream(entry), zipOutputStream); } zipOutputStream.closeEntry(); } } 的单行解决方案:

sed

如一条评论中所述,此MYVAR=$(sed -nE 's/^BAZ\s*=\s*(\S*)$/\1/p' inputfile) 命令在以下情形中不会产生所需的结果:

sed

此处BAZ = 10 // some comment ending with 0 将分配MYVAR而不是0。要解决此问题,可以将正则表达式更改为:

10

现在MYVAR=$(sed -nE 's/^BAZ\s*=\s*([^\s\/]*).*/\1/p' inputfile) 根据需要MYVAR。打破正则表达式:

10

答案 1 :(得分:0)

一个简单的答案是使用parameter expansion来删除不需要的空格。以下内容应该与您考虑的类似问题的答案非常相似:

#!/usr/bin/env bash
case $BASH_VERSION in ''|[123].*) echo "ERROR: Requires bash 4.0" >&2; exit 1;; esac

shopt -s extglob                     # make *([[:space:]]) mean "zero-or-more spaces"
declare -A array=( )

while read -r line; do
  line=${line%%*([[:space:]])"//"*}  # trim everything after the first "//" in the line
  [[ $line = *=* ]] || continue      # skip lines without an "=" after this is done
  key=${line%%*([[:space:]])=*}      # key is everything before the first "=" & whitespace
  value=${line#*=}                   # value is everything after the first "="
  value=${value##+([[:space:]])}     # remove leading spaces from value
  array[$key]=$value
done

# print result to stderr
declare -p array >&2

https://ideone.com/UwYs3C看到这个运行,在问题中给出的输入有以下结果:

declare -A array=([FOO]="1" [BAR]="0" [BAZ]="10" )

...因此,可以echo "Read value for foo as ${array[FOO]}"发出Read value for foo as 1