在 shell 脚本中使用 sed 替换文件中的 IP 地址

在 shell 脚本中使用 sed 替换文件中的 IP 地址

我有一个脚本,它可以在文件中找到一个字符串并将其替换为新字符串。

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

现在我需要一个正则表达式作为条件,它还检查旧字符串后面是否有数字以外的任何内容。

我尝试了这个但是没有用:

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

任何想法?

答案1

要否定正则表达式中的某个范围,插入符号必须是里面方括号。

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 不会解析单引号内的变量,因此$old_string$new_string不会被您在脚本中设置的任何 bash 变量替换,但会在该sed命令中直接使用。如果您使用双引号,它们将被替换。

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

更新:

由于该文件不包含任何事物在要替换的字符串之后,[^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

相关内容