在shell脚本中使用sed来replace文件中的IP地址

我有一个脚本,发现一个文件中的string用一个新的stringreplace它。

$ sed -i 's/$old_string'/'$new_string'/g' $FILENAME 

现在我需要条件是一个正则expression式,也检查旧的string是否跟随任何东西,但数字。

我试过这个,但没有奏效:

 $ sed -i -r 's/$old_string(^[0-9])+/$new_string/g' $FILENAME 

任何想法?

为了否定正则expression式中的范围,插入符必须位于方括号内。

 sed -i -r 's/$old_string([^0-9])+/$new_string/g' $FILENAME 

如果你没有使用反向引用,那么括号在这种情况下也是不必要的(它看起来不像你)。

 sed -i -r 's/$old_string[^0-9]+/$new_string/g' $FILENAME 

最后一件事情是:bash不会分析单引号内的variables,所以$old_string$new_string不会被您在脚本中设置的任何bashvariablesreplace,而是直接在sed命令中使用。 如果您使用双引号,则会被replace。

 sed -i -r "s/$old_string[^0-9]+/$new_string/g" $FILENAME 

更新:

由于该文件在你想要replace的string后没有包含任何内容 ,因此正则expression式的[^0-9]+部分没有任何匹配。 如果IP地址之后有空格,这将工作。 我们可以用$来匹配行的结尾。

 sed -i -r 's/123.123.123.1$/4.4.4.4/g' $FILENAME 

再一次更新。 这个匹配任何不是数字或不是字符的字符。 对于这一个,我们需要括号将这两个选项分组。

 sed -i -r 's/123.123.123.1([^0-9]+|$)/4.4.4.4/g' $FILENAME 

由于我们有括号,所以可以使用反向引用来包含匹配的内容:

 sed -i -r 's/123.123.123.1([^0-9]+|$)/4.4.4.4\1/g' $FILENAME