当文件名包含空格时,搜索并替换目录中所有 .php 文件中的登录字符串

当文件名包含空格时,搜索并替换目录中所有 .php 文件中的登录字符串

我更改了 mySQL 的密码和用户名,并且需要相应地替换所有 PHP 脚本中的连接字符串。

我在使用该命令时遇到问题,因为我的许多 php 文件名都包含空格。

我可以更改什么以使该命令正常工作而不会出现“没有这样的文件或目录”错误?

这是我正在使用的命令:

pattern='mysql_connect("localhost", "olduser", "oldpwd")'
replacement='mysql_connect("localhost", "newuser", "newpwd")'
find . -name "*.php" | xargs -n 1 sed -i -e 's|$pattern|$replacement|g'

我不熟悉 xargs 和 sed,我从回答类似的问题。

(我想我会将 mysql_connect 语句放入 php include 文件中,下次只在一个地方更改它。)

我正在使用 BASH 运行 Ubuntu 14.04 LTS

答案1

您必须使用NULL byte和 双引号:

find . -name '*.php' -print0 |
    xargs -0 -n 1 sed -i -e "s|$pattern|$replacement|g"

或者用一个简单的for循环

for p in *php; do
    sed -i -e "s|$pattern|$replacement|g" "$p"
done

学习如何在shell中正确引用,这非常重要:

“双引号”包含空格/元字符的每个文字以及每一个扩张:"$var""$(command "$var")""${array[@]}""a & b"。用于'single quotes'代码或文字$'s: 'Costs $5 US'ssh host 'echo "$HOSTNAME"'.看
http://mywiki.wooledge.org/Quotes
http://mywiki.wooledge.org/Arguments
http://wiki.bash-hackers.org/syntax/words

答案2

我能够通过像这样替换值来找到成功:

find . -name "*.php" | xargs -n 1 sed -i -e 's/\"olduser\", \"oldpwd\"/\"newuser\", \"newpwd\"/g'

相关内容