C 使用bash+;替换文件中的字符串;环境变量

C 使用bash+;替换文件中的字符串;环境变量,c,bash,shell,unix,sed,C,Bash,Shell,Unix,Sed,简单地说,我有一个文件(请原谅我无用的伪代码) file.txt std::string filename = "filename.txt" double v_no = 2.0; const int v_minor = 0; // < --- Target std::string random_var1 = "Hello" std::string random_var2 = "Hello 2" int main() { // .. } 设置的版本变量仅用于测试目的 这将

简单地说,我有一个文件(请原谅我无用的伪代码)

file.txt

std::string filename = "filename.txt"

double v_no = 2.0;

const int v_minor = 0; // < --- Target

std::string random_var1 = "Hello"
std::string random_var2 = "Hello 2"

int main()
{
    // .. 
}
设置的版本变量仅用于测试目的

这将返回错误

sed: 1: "s/v_minor = %d/v_minor  ...": bad flag in substitute command: '/'
我正在运行Mac OS X Yosemite进行此测试

同样,本质上%d可以是任何整数


谢谢

根据您的描述,我建议另一种更简单的方法,如下所示(简单会减少bug…):

sed -i '' 's/v_minor = %d/v_minor = $VERSION/g/' file.txt
#                                             ^
#                                            /
#                       remove this slash ---
首先,把你的目标改为

const int v_minor = V_MINOR; // < --- Target
第三,编写脚本生成版本.h,如下所示:

#ifndef _VERSION_H_
#define V_MINOR  0           // <== this 0 is what you want to change.
#endif
\ifndef\u版本\u H_

#定义适用于您的V_MINOR 0/:

sed -i '' "s/v_minor = .*$/v_minor = $VERSION/g" file.txt
.*$表示直到字符串结束。
在使用变量进行操作时,不要忘记使用

只是为了确认,
%d
将不匹配“任何整数”,您需要使用
[[:digit:][:digit:]*
。祝你好运。从外部来说,版本行可能如下所示:
const int v_minor=/*version*/0
一个简单的sed/awk不能轻易地保留这些注释并替换
0
,更不用说
0
可以放在下一行,即“第一行:
v_minor=
,第二行:
0。这需要解析器理解C语言语法。甚至等号('=')周围的空格也会产生问题,更不用说sed/awk会错误地解析
if(v_minor==5)
之类的用法,将第二个
=
替换为目标编号,从而导致编译时错误。这似乎是一种更有效/更少黑客攻击的方法。我也可以在Windows版本上轻松完成这项任务。谢谢。此外,不必总是更改“.h”文件,可以在构建时传递版本,例如,“make…-D{var}={value}…”;这通常是针对内部版本号进行的,但您也可以通过这种方式从环境中获取版本号,例如从txt文件或git等。Atlassian Bambol正在处理我的内部版本+开发版本。基本上,我所做的是在bambol“VERSION=${bambol.buildNumber}”中设置一个环境变量。然后在我的软件中通过将版本解析到头文件来引用它。将version.h中的变量设置为bambol.buildNumber的脚本在bambol构建时执行—就在我的make+打包执行之前。
#ifndef _VERSION_H_
#define V_MINOR  0           // <== this 0 is what you want to change.
#endif
sed -i '' "s/v_minor = .*$/v_minor = $VERSION/g" file.txt