如何使用sed命令更改文件中的字符串



操作系统: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

请注意,$ver1bs包围以确保sed在词边界上匹配(例如,sed s/1/a/g将在1,(1),12,21,121212上匹配(将所有1s替换为a),而sed s/b1b/a/g只匹配1,(1)和其他两侧都有词边界的1s)。

考虑查看bashsed的手册页,以及正则表达式教程:https://www.regular-expressions.info/.

相关内容

  • 没有找到相关文章

最新更新