使用shell脚本从文本文件中获取数据

时间:2015-02-16 22:25:06

标签: shell

我有一个文本文件,其中一行包含 “#define VERSION_NUMBER 0011” 我需要找到该行并将4位数值“0011”分配给变量。

2 个答案:

答案 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的评估分配给cc现在包含该号码。

问题

可能的问题是,这不考虑空白,如果此行的开头或结尾有标签或空格,则会失败。

忏悔:我必须学习一点unix正则表达式来回答这个问题,参考:smugbook