0

我有一个文件

#define x 1
#define y 2

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

4

2 回答 2

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。:-)

于 2013-05-31T16:32:31.263 回答
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
于 2013-05-31T15:52:00.623 回答