让我们说,为了简单起见,我有一个文件(请原谅我无用的伪代码)
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可以是任何整数。
谢谢
答案 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解决方案相比,我更喜欢这个简单的解决方案。