Bash 替换文件行

Bash 替换文件行,bash,google-chrome-extension,Bash,Google Chrome Extension,我正在尝试制作一个版本增量脚本。所以我有一个文件manifest.json,它有预定义的行(例如45行) $1参数是文件名 $2参数是新版本号(例如0.3.5.29) 输入类似于$BumpVersion.sh manifest.json 0.15.2.34 我需要替换例如“版本”:“0.2.0.1”, 使用“版本”:“0.2.1.0”, --编辑-- 哦,我忘了,版本并不总是0.2.1.5,它可以是0.3 我知道行号和行内容,我基本上只需要替换行号。 我在Windows上的Git Bash中做这

我正在尝试制作一个版本增量脚本。所以我有一个文件
manifest.json
,它有预定义的行(例如45行)

$1
参数是文件名
$2
参数是新版本号(例如
0.3.5.29

输入类似于
$BumpVersion.sh manifest.json 0.15.2.34

我需要替换例如
“版本”:“0.2.0.1”,
使用
“版本”:“0.2.1.0”,

--编辑--
哦,我忘了,版本并不总是
0.2.1.5
,它可以是
0.3

我知道行号和行内容,我基本上只需要替换行号。 我在Windows上的Git Bash中做这件事,如果可能的话,它应该可以在Linux和Unix上工作


(我从未使用过bash脚本,但我需要它来支持跨平台)

应该是一个简单的
sed
脚本。(我假设您的报价是必需的):

然而,我不喜欢这样。相反,您应该有一个模板,并通过替换已知字符串(如
%VERSION%
)来重写模板。例如,您有一个名为VERSION.json.template的文件:

这更干净,更容易实现

${file%.template}
从文件名中删除
.template
后缀。如果您使用的是版本控制系统,则不会在每次编译时保存
version.json
文件的新版本。相反,您只需将其作为标准构建例程的一部分,该例程应包含一个干净的机制来删除不需要的
version.json
文件


如果使用类似的生成系统,则可以使用它的各种任务(如复制/筛选任务)为您的网页在其他位置生成和复制此文件。

您的BumpVersion.sh脚本可能如下所示

#!/bin/sh
sed -i "/\(\"version\":\).*/\1 \"$2\"/" "$1"

问题是该文件不是用于VCS,而是用于GoogleChrome扩展名-manifest.json文件。我不必在每个版本上只为发布的版本更改此文件的版本。哦,我忘了,版本并不总是
0.2.1.5
,它可以是
0.3
sed字符串可以更改为
s/version:.*/version$version/
,这将允许任何版本号匹配,但如果其中有多行单词
version
,则可能会导致问题。我建议使用模板方法并使用
%VERSION%
,这更容易在文件中保持唯一性。当前的答案不起作用,因为正则表达式:“VERSION:\”将与文本“VERSION:”匹配,但JSON关键字当然是“VERSION”:。将冒号移动到转义的双引号之后,就可以了。(我想有人会复制粘贴并调整它,然后想知道它为什么会失败。)\1代表什么原因我在char 19“未知命令:'\'上出错?您剪切并粘贴了吗
\1
保存字符串
“version”:
,因为没有理由在sed脚本中键入两次。我不工作。。。sed:-e expression#1,char 19:unknown command:``请粘贴获得该错误的确切命令。这也可能是sed版本的问题(-i目前在OSX上受支持,但在其他UNIX上可能不受支持)。只需将\1替换为“version”:字符串,因为您希望保留该文本(并替换其后面的内容)。您将该版本升级了多少次?我自己也有一些chrome扩展。我只是手工操作。这只是一个需要更新的地方。它不值得一个shell脚本来完成它。依我所见
file="version.json.template"
new_version="1.2.2.1"
sed "s/%VERSION%/$new_version/" > "${file%.template}"
#!/bin/sh
sed -i "/\(\"version\":\).*/\1 \"$2\"/" "$1"