了解sed用法

时间:2014-02-14 09:08:17

标签: regex bash sed

我使用sed自动更新我的doxyfile中的版本:

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

使用$$VERSION = 1.1.0(例如)

并作为来源:

PROJECT_NUMBER         = 1.0.10

但它会生成名为.doxygen的{​​{1}}的副本,并且不会更改该行。我测试了我的正则表达式here

我不明白什么是错的,因为它可以使用我的plist文件:

.doxygen-e

1 个答案:

答案 0 :(得分:1)

这里有几个问题:

您需要在$FOO中将shell变量$$FOO称为Makefile。如果您尝试在bash或任何其他shell中执行此操作,请说:

$$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中调用,则需要将$加倍。