使用包含方括号的 xml 中的 sed 或 awk 替换 IP

Substitute IP using sed or awk from xml which contains square brakets

我有这段代码想更改 IP 来自:

<mailHost>[10.237.30.150]:25</mailHost>

我需要换个IP: 预期结果:

<mailHost>[10.237.30.151]:25</mailHost>

这是我尝试过的方法,但仍然报错并且没有任何改变。

sed -n "/<mailHost>/ {s/10.237.30.150/10.237.30.151/}" file

非常欢迎任何提示:) 谢谢。

以下 awk 可能会对您有所帮助。

awk -v value="new_value" '/mailHost/{match([=10=],/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/);val=substr([=10=],RSTART,RLENGTH);if(val){print substr([=10=],1,RSTART-1) value substr([=10=],RSTART+RLENGTH);next}} 1'  Input_file

如果您想对 Input_file 本身进行更改,请在上面的命令 > temp_file && mv temp_file Input_file.

中添加以下内容

现在也添加一个非单行形式的解释。

awk -v value="new_value" '
/mailHost/{
    match([=11=],/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/);
    val=substr([=11=],RSTART,RLENGTH);
    if(val){
       print substr([=11=],1,RSTART-1) value substr([=11=],RSTART+RLENGTH);
       next}
}
1'   Input_file
sed -i "s/10.237.30.150/10.237.30.151/g" file

这不行吗?

您的问题不明确(您是要替换出现在任何地方的任何 IP,还是仅替换该特定 IP 或仅在该上下文中的特定 IP 或该上下文中的任何 IP 或其他内容?)但是这个 可能是你想要的:

$ sed 's/\(<mailHost>\[\)[^]]*/0.237.30.151/' file
<mailHost>[10.237.30.151]:25</mailHost>