SED 使用正则表达式查找和替换

SED 使用正则表达式查找和替换

好吧,我很困惑并且没有主意。

我正在尝试用新的 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)('|\")"

相关内容