好吧,所以我很困惑,没有想法。
我正在尝试用新 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)您必须转义句点,句点匹配任何字符。因此,要使其与文字句点匹配,您需要通过在其前面放置反斜杠来对其进行转义:
它似乎会起作用,因为元字符句点仍然与句点匹配。
2)你真的只需要匹配引号中的IP吗?如果不是你不必担心匹配它们并将它们放回去,那只会让它变得更加混乱。
3)有什么理由不能通过为每个 IP 多次运行命令来简化这一点?
4) 将 IP 地址与正则表达式匹配会导致精神错乱,并可能导致抽搐,请考虑类似 Perl 的Net::IP::Match::Regexp :-)
5)您确定该文件中没有回车符混淆sed吗?尝试 cat -vE 文件并查找 ^M
6) 去掉 grep 并通过 -name '*.php' 来查找
我认为你唯一的问题是你需要取消转义单引号。不过,我更喜欢这个:
除了取消转义单引号外,我还保存了匹配的引号字符,因此可以在新 IP 周围恢复它。这是grep: