我有一个
的文件#define x 1
#define y 2
我必须阅读此文件的内容,然后使用bash将它们存储在$ x = 1和$ y = 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
$ 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