给定包含以下内容的文件:
// This is a comment
FOO = 1
BAR = 0
// Comments can be anywhere...
BAZ = 10 //...even here!
键始终锚定在一行的开头,但“=
”字符两侧可能有任意数量的空格。该值也可以由任意数量的空格尾随。
编辑:值和/或其尾随空格也可能后跟注释。
如何使用bash
脚本和/或awk
或sed
将密钥的价值作为一行?我希望能够做到这样的事情:
MYVAL=$(<string manipulation to get value of "BAZ" from /tmp/foo.txt>)
到达
>echo $MYVAL
10
>
我对bash脚本非常糟糕;从来没有足够流利的字符串操作工具套件知道如何处理这个。我能得到的最远的是
> grep BAZ /tmp/foo.txt
BAZ = 10
并且真的不知道下一步该做什么。
我确实搜索了SO,但找不到具有完全相同前提的解决方案(具体来说,'=
'两侧存在可变数量的空格),以及解决方案类似的问题在我的前提下不起作用。
答案 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
。