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

时间:2014-12-01 01:57:08

标签: 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()
{
    // .. 
}

我在同一目录中有一个bash文件--set_version.sh

我想用这个脚本替换此文件中的字符串 - 特别是“v_minor = 0”和“v_minor = $ VARIABLE” - 在我的例子中,变量将是服务器上的环境集。

所以我们说它已经成功运行了几次。现在字符串显示为“v_minor = 2”。我仍然希望使用相同的set_version.sh脚本将2更改为变量。

在我的软件的Windows版本中,我有一个批处理文件,将“v_minor =%d”更改为“v_minor =%VERSION%”。

我的问题是我如何在bash中做类似的事情?例如。忽略字符串中的小数,并将其更改为变量。

到目前为止我得到了什么:

set_version.sh

#!/bin/bash

VERSION=75

sed -i '' 's/v_minor = %d/v_minor = $VERSION/g/' file.txt

设置版本var仅用于测试目的。

这会返回错误

sed: 1: "s/v_minor = %d/v_minor  ...": bad flag in substitute command: '/'

我正在运行Mac OS X Yosemite进行此测试。

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

谢谢

3 个答案:

答案 0 :(得分:2)

这对你有用:

sed -i '' "s/v_minor = .*$/v_minor = $VERSION/g" file.txt

。* $表示直到该字符串结尾。 使用变量时不要忘记使用" "

答案 1 :(得分:1)

sed -i '' 's/v_minor = %d/v_minor = $VERSION/g/' file.txt
#                                             ^
#                                            /
#                       remove this slash ---

答案 2 :(得分:1)

根据你的描述,我会建议另一种更简单的方法如下(简单性会减少错误......):

首先,将目标更改为

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

其次,在目标语句之前的任何位置添加一个包含行:

#include "version.h"

第三,编写一个脚本来生成version.h,类似于以下内容:

#ifndef _VERSION_H_
#define V_MINOR  0           // <== this 0 is what you want to change.
#endif

生成一个脚本来输出所说的version.h太简单了(只是一些固定的打印加上目标号码)。因此,我不在这里提供。

与那些可能容易出错的sed-awk-perl解决方案相比,我更喜欢这个简单的解决方案。