好吧,我很困惑并且没有主意。
我正在尝试用新的 IP 地址替换所有旧的 IP 地址。
find -type f | grep \.php$ | xargs sed -r -i "s/(\'|\")(localhost|127.0.0.1|10.0.32.4|10.0.32.5)(\'|\")/\"10.0.32.165\"/g"
我正在尝试查找所有 PHP 文件,并将以下任何一个 (localhost、127.0.0.1、10.0.32.4、10.0.32.5) 替换为 10.0.32.165。
find * | grep \.php$ | xargs egrep "(\'|\")(localhost|127.0.0.1|10.0.32.4|10.0.32.5)(\'|\")"
运行第一个命令后,我想确保没有留下旧值的痕迹,因此我运行上述命令,但不幸的是它返回
siteeval/application/libraries/fetcher.url.class.php: $this->host = "10.0.32.4";
有人知道我做错了什么吗?或者可以告诉我一个更好的方法吗?
答案1
尝试这个:
sed -e 's/\(127\.0\.0\.1\|10\.0\.32\.4\|localhost\|10\.0\.32\.5\)/10.0.32.165/g'
您需要转义括号和竖线。如果您想确保它们始终位于引号之间,请尝试:
sed -e 's/\"\(127\.0\.0\.1\|10\.0\.32\.4\|localhost\|10\.0\.32\.5\)\"/10.0.32.165/g'
稍微测试一下:
$ echo '"10.0.32.4"' | sed -e 's/\"\(127\.0\.0\.1\|10\.0\.32\.4\|localhost\|10\.0\.32\.5\)\"/10.0.32.165/g'
10.0.32.165
$ echo '"localhost"' | sed -e 's/\"\(127\.0\.0\.1\|10\.0\.32\.4\|localhost\|10\.0\.32\.5\)\"/10.0.32.165/g'
10.0.32.165
对未来的建议。在转向复杂情况之前,始终先尝试小样本(像这样使用 echo)。
*编辑:也逃脱了点。
答案2
1) 您必须转义句号,句号可匹配任何字符。因此,要使其匹配文字句号,您需要在其前面加上反斜杠来转义它:
\.
它似乎可以工作,因为元字符句点仍然与句点匹配。
2) 您真的需要只匹配引号中的 IP 吗?如果不是,您不必担心匹配它们并将它们放回原位,这只会让事情变得更加混乱。
3)有什么原因不能通过对每个 IP 多次运行命令来简化这一过程?
4)使用正则表达式匹配 IP 地址会导致精神错乱,甚至抽搐,可以考虑使用类似 Perl 的网络::IP::匹配::正则表达式:-)
5) 你确定该文件中没有回车符会混淆 sed 吗?尝试 cat -vE file 并查找 ^M
6)去掉 grep,直接传递 -name '*.php' 来查找
答案3
我认为你唯一的问题是你需要取消单引号的转义。不过我更喜欢这个:
find -type f -name '*.php' | xargs sed -r -i "s/\('|\"\)\(localhost|127.0.0.1|10.0.32.4|10.0.32.5\)\('|\"\)/${1}10.0.32.165${3}/g"
除了取消转义单引号之外,我还保存了匹配的引号字符,以便可以在新 IP 周围恢复它。这是 grep:
find . -type f -name '*.php' | xargs egrep "('|\")(localhost|127.0.0.1|10.0.32.4|10.0.32.165)('|\")"