好吧,所以我很困惑,没有想法。
我试图用新的IP地址replace所有的旧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"
我试图find所有的PHP文件,并用10.0.32.165replace下面的任何一个(localhost,127.0.0.1,10.0.32.4,10.0.32.5)。
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";
有人看到我做错了什么? 或者也许可以让我成为一个更好的方式做到这一点?
尝试这个:
sed -e 's/\(127\.0\.0\.1\|10\.0\.32\.4\|localhost\|10\.0\.32\.5\)/10.0.32.165/g'
您需要转义圆括号和pipe道。 如果您想确保它们始终位于引号之间,请尝试:
sed -e 's/\"\(127\.0\.0\.1\|10\.0\.32\.4\|localhost\|10\.0\.32\.5\)\"/10.0.32.165/g'
testing一下:
$ 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
对未来的build议。 在移动到复杂的案例之前,总是先尝试使用小样本(使用这种回声)。
*编辑:也逃脱了点。
1)你必须逃避时期,一段时间匹配任何字符。 因此,为了使它符合一个字面上的时期,你需要在它之前加一个反斜杠来逃避它:
\.
它似乎工作,因为元字符期间仍然匹配一个时期。
2)你真的只需要匹配引号中的IP地址吗? 如果不是,你不必担心匹配和放弃,这就更加糟糕了。
3)通过多次为每个IP运行命令,无法简化这个问题?
4)匹配的IP地址与正则expression式导致疯狂,可能抽搐,考虑像Perl的Net :: IP :: Match :: Regexp 🙂
5)你确定在这个文件中没有回车令人困惑的sed? 尝试cat -vE文件并查找^ M
6)摆脱grep,只是传递名称“*。PHP”来find代替
我认为你唯一的问题是你需要解开单引号。 不过,我喜欢这个稍微好一些:
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)('|\")"