SED查找和replacew \ Regularexpression式

好吧,所以我很困惑,没有想法。

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