请教各位大牛,用正则表达式从配置文件里匹配IP地址“10.46.178.77”,现在需要将第一个匹配结果的IP修改为108.38.105.14,注释中的不修改。该怎么做?
<IPvX>4</IPvX>
<localIP>localhost</localIP>
<seedcount>1</seedcount>
<seedport>7000</seedport>
<s0>10.46.178.77</s0>
<!-- sample of 3 seeds -->
<!--
<seedcount>3</seedcount>
<seedport>7000</seedport>
<s0>10.46.178.77</s0>
<s1>10.46.178.78</s1>
<s2>10.46.178.79</s2>
-->
用这样的正则表达式,会把匹配到的所有结果都修改掉,会误改不需要改的配置
ip=108.38.105.14
sed -i "s/10.46.178.77/$ip/g" $link_config_xml
不知道你在什么环境下用的正则,正则一般替换的函数replace都有一个参数是限制替换次数的
比如php:
$p = /[b]/
$r = "a"
echo preg_replace($p,$r,"bbbb",1) 这样就只替换第一个b了
不知道你什么语言,以下代码在C#下是测试通过的
str=Regex.Replace(str,@"(?s)(?<!<!--[^-]*)\d+\.\d+\.\d+\.\d+(?![^-]*-->)","108.38.105.14");
像这种需求,你用libxml来解析xml,然后xpath获取这个tag的一个链表,然后取第一个元素来修改就可以满足你的需求
这比正则表达式更清晰,准确,也不容易出错。