2014-02-14 60 views
0

我用SED以此来automaticaly更新我的Doxyfile版本:了解SED使用

sed -i -e "s/PROJECT_NUMBER.([ ]{2,}=.*)/PROJECT_NUMBER = $$VERSION/g" ".doxygen" 

$$VERSION = 1.1.0(例如)

,并作为源:

PROJECT_NUMBER   = 1.0.10 

但它会生成名为.doxygen-e的我的.doxygen的复制版本,请勿更改此行。我测试了我的正则表达式here

我不明白什么是错的因为它的工作原理与使用此我的plist文件的事实:

sed -i -e "s/@[email protected]/$$VERSION/g" "./$${TARGET}.app/Contents/Info.plist" 
+0

你是在'Makefile'中尝试这个吗? – devnull

+0

@devnull这是我的目标,但我甚至不能在bash中做到这一点... –

回答

1

有几个问题在这里:

您需要参考一个shell变量$FOO as $$FOO in a Makefile。如果你正在尝试做的bash或任何其他壳,他说:

$$FOO 

会导致当前进程的PID数字与FOO连接起来,例如如果当前进程的PID为1234,那么你会得到:

1234FOO 

这就是说,你的正则表达式似乎是错的不止一个计数。你说:

PROJECT_NUMBER.([ ]{2,}=.*) 

既然你使用sed任何选项,将允许使用扩展正则表达式的,这将匹配字符串PROJECT_NUMBER,之后的一个字符,然后(,其次是2或更多的空格,=符号,直到它遇到最后的)在字符串中。

既然你还没有有关文件在该行的样子提到什么,我认为它的形式是:

PROJECT_NUMBER = 42.42 

下可能会为你工作:

sed 's/\(PROJECT_NUMBER[ ]*=[ ]*\)[^ ]*/\1$VERSION/' filename 

如果从Makefile中调用,则需要将$加倍。

+0

真棒。但是,正如你所提到的,我忘了告诉你关于来源的信息,我已经编辑了问题 –

+0

@Samoth事实证明,关于消息来源的假设是正确的,所以很可能上述内容适用于你。 – devnull

+0

@Samoth请注意,您已经_drastically_修改了'sed'表达式。 – devnull