操作系统:Windows 10
工具:git bash我想使用sed命令来改变一些文件的版本字符串。在git bash中,我尝试了下面的命令,它可以工作。
$ sed -i 's/1.0.0.21/1.0.0.22/g' ../fossa/PluginManifest.xml
然后将sed命令放入脚本文件中,如下所示:
$ cat UpdateVersion.sh
echo $1
echo $2
sed -i 's/$1/$2/g' ../fossa/PluginManifest.xml
然后我执行下面的命令:
$ source UpdateVersion.sh 1.0.0.21 1.0.0.22
1.0.0.21
1.0.0.22
当我检查文件时,我发现版本字符串没有改变。为什么?
一般来说,在使用之前,任何和所有输入都应该进行适当的验证、清理和/或编码,特别是对于传递给命令/控制接口(例如shell执行的sed)的输入。
在您的示例中,以下可能是合适的(.
s被转义,正如anubhava和mashup两次建议的那样,因为未转义的.
s指示正则表达式引擎匹配任何字符):
1 if [[ !( $1 =~ ^[0-9.]+$ && $2 =~ ^[0-9.]+$ ) ]]; then
2 echo "Invalid version syntax" 1>&2
3 exit 1
4 fi
5
6 ver1=${1//./\.}
7 ver2=${2//./\.}
8
9 sed -i "s/b$ver1b/$ver2/" ../fossa/PluginManifest.xml
请注意,$ver1
被b
s包围以确保sed
在词边界上匹配(例如,sed s/1/a/g
将在1
,(1)
,12
,21
,121
和212
上匹配(将所有1
s替换为a
),而sed s/b1b/a/g
只匹配1
,(1)
和其他两侧都有词边界的1
s)。
考虑查看bash
和sed
的手册页,以及正则表达式教程:https://www.regular-expressions.info/.