我有一个文本文件,其中一行包含 “#define VERSION_NUMBER 0011” 我需要找到该行并将4位数值“0011”分配给变量。
答案 0 :(得分:1)
VAR=$(cat file | grep "#define VERSION_NUMBER" | awk '{print $3}')
尽管如此,这似乎有些倒退。是否可以更改构建脚本以传递-DVERSION_NUMBER=0011
并定义版本号?然后它可以存储在一个简单的语言独立的文本文件中,不包含任何其他内容。
答案 1 :(得分:0)
我会使用grep和regex,一旦grep返回一个值,你可以很容易地将该值赋给bash变量。以下是工作测试代码:
$ echo "#define VERSION_NUMBER 0011" > test.c
$ c=`cat test.c | sed -n -e 's/^#define VERSION_NUMBER \([0-9]\{4\}\)$/\1/p'`
$ echo $c
0011
这是重要的一句话:
c=`cat test.c | sed -n -e 's/^#define VERSION_NUMBER \([0-9]\{4\}\)$/\1/p'`
细分它由c
组成,变量名称分配给`...`
命令的评估(sed
)。 sed命令是正则表达式的位置。我想出的是:
^
:该行以#define VERSION_NUMBER
:一个文本文字,这将是字符串中的字符字符。\(...\)
:构成匹配部分的一组逃脱的parens。[0-9]
:在比赛中,存在一个数字(0到9)。\{4\}
:前面的数字完全重复4次。
*
获取任意数量的匹配,\{4,\}
获取4个或更多匹配,或\{4,6\}
获得4-6个匹配。$
:行尾运行此功能时,sed会发出号码,因为我们已将sed的评估分配给c
,c
现在包含该号码。
可能的问题是,这不考虑空白,如果此行的开头或结尾有标签或空格,则会失败。
忏悔:我必须学习一点unix正则表达式来回答这个问题,参考:smugbook。