在文件中搜索#define指令,然后使用bash将它们存储在变量中

时间:2013-05-31 15:41:06

标签: bash

我有一个

的文件
#define x 1
#define y 2

我必须阅读此文件的内容,然后使用bash将它们存储在$ x = 1和$ y = 2等变量中

2 个答案:

答案 0 :(得分:1)

这在大多数情况下都适用:

eval $(sed -e "s/#define \([a-zA-Z0-9_]*\)  *\(.*\)/\1='\2'/g" inputfile)

宏无法扩展到包含单引号的令牌。它也不处理可能出现空白的地方的标签。

谨防C语言的血腥细节,即使不是所有答案都忽略了大部分内容:

  • #
  • 之前可以有空格(空格和制表符)和注释
  • #define
  • 之间可能有空格和评论
  • define与宏标识符
  • 之间可以有注释
  • 有类似函数的宏看起来不同,即#define square(x) ((x) * (x))

这应该让你知道为什么用一种解析器来解析一个复杂的语言几乎总是一个坏主意。如果你有gcc,你可以让它处理上面的前三个子弹。我们的想法是让gcc的预处理器以规范格式转储宏而不需要注释和标签,然后处理:

eval $(gcc -E -dM -x c -std=c89 inputfile |
       grep -v '^#define _'|
       sed -e "s/#define \([a-zA-Z0-9]*\) \(.*\)/\1='\2'/g")

grep过滤掉所有gcc内部预定义宏,如_LP64。如果你在

上运行它
/**/    #       /**/    define/**/      x       /**/1

(每个空格都是一个标签),它将导致

eval x=1

对于快速和肮脏的黑客攻击,你可能会使用shell。 : - )

答案 1 :(得分:0)

某些东西 让您入门:

while read check varname value; do # Read the 3 values from each line
    if [[ $check == \#define ]]; then # Check if 1st value is #define
        export $varname=$value # If it is assign variables.
    fi
done < myfile

测试:

$ cat myfile
#define x 1
#define y 2
$ while read check varname value; do
> if [[ $check == \#define ]]; then
> export $varname=$value
> fi
> done < myfile 
$ echo $x
1
$ echo $y
2

测试#2

$ cat myfile2 
#define x happy
#define y nappy
$ while read check varname value; do
> if [[ $check == \#define ]]; then
> export $varname=$value
> fi
> done < myfile2 
$ echo $x
happy
$ echo $y
nappy