【发布时间】:2013-01-10 14:55:40
【问题描述】:
对于知道的人来说可能是一个简单的问题,但我很难从文件中检索一些变量值。我的文件是这样的:
variable1 12
variable2 43
variable3 897
我想得到变量 2 的值,43。
我用 sed 尝试了一些命令,但没有成功:
sed -n 's/variable2 //;s/variable3//' myFile
【问题讨论】:
对于知道的人来说可能是一个简单的问题,但我很难从文件中检索一些变量值。我的文件是这样的:
variable1 12
variable2 43
variable3 897
我想得到变量 2 的值,43。
我用 sed 尝试了一些命令,但没有成功:
sed -n 's/variable2 //;s/variable3//' myFile
【问题讨论】:
仅限 sed:
$ sed -n 's/^variable2 //p' file
43
您的问题是您使用-n 来抑制sed 的输出,因此您需要p 标志,以便sed 打印发生替换的行。
因为这只是模式匹配,所以我会使用 only grep 来解决这个问题:
$ cat file
variable1 12
variable2 43
variable3 897
$ grep -Po '(?<=^variable2 )\d+' file
43
或者甚至只是awk:
$ awk '$1=="variable2"/{print $2}' file
43
【讨论】:
grep -Po,但我很少推荐它,因为它不是很便携。不过,+1 为您的sed 解决方案。
GNU sed,出于好奇,哪里不支持?
-P 选项,在 FreeBSD 或除 OSX 之外的任何其他系统中都没有,OSX 在版本 10.6 中开始支持它。它当然不是通用的。
variable20,您的awk 解决方案将失败。在寻找固定字符串时,最好测试固定字符串。 awk '$1=="variable2"{print $2}' 或者 pepoluan posted,因为它提供了更好的灵活性。
你必须使用sed吗?
我更喜欢使用awk 来处理这类事情:
awk -v varname="variable2" '$1==varname {print $2}' myFile
只要没有包含空格的变量(在左列中),这将起作用。
编辑:
由于标题是“用bash从文件中获取变量值”,所以这里是一个不涉及外部程序的版本
wantvar="variable2"
datafile="myFile"
while read varname varval; do
# Case-insensitive matching. If you need case-sensitivity, remove the pair of commas
# on both sides.
if [[ ${varname,,} = ${wantvar,,} ]]; then
echo $varval
break
fi
done < $datafile
【讨论】:
varname 没有任何好处,如果你做内联赋值,还不如awk '$1=="variable2"{print $2}' file 加上这样的事情远离bash。
some_variable="$(awk ....)"
p 标志到 sed。真的bash不适合这种东西!
对于这样格式的文件,grep|awk 将起作用:
grep variable2 文件 | awk '{print $2}'
对于格式稍有不同的文件,不要指望它。
【讨论】:
grep 要么 awk 两者都是一个进程。